4 errores fáciles de cometer en C

Saludos queridos lectores. En este artículo aprenderás a evitar los errores más habituales al programar en C.





Uso incorrecto del carácter de final de línea (carácter nulo '\ 0')

Considere el siguiente código:





#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv){
	char *str = "Hello \0 world!\n";
  int l = strlen(str);
  printf("Str: %s\nLength: %d\n", str, l);
}
      
      



En este código, obtendremos los siguientes resultados





Str: Hello 
Length: 6
      
      



Porque el marcador de fin de línea se coloca entre las subcadenas "Hola" y "¡mundo! \ n", y la mayoría de las funciones de la biblioteca usan la igualdad del carácter buscado con un carácter nulo para verificar si se alcanza el final de la cadena, es decir:





while((cur_symbol = *++str) != '\0') process_symbol(cur_symbol);
      
      



luego, después de leer el espacio y llegar al carácter '\0'



, la función strlen devolverá un valor de 6. Ignora el carácter nulo. De manera similar, la función printf sustituirá los caracteres de línea % s str en el flujo de salida estándar hasta que se lea el símbolo cero.





, . ? , , . .. char , , , long int char[], , char * ptr. , 32- , - (, 232 ). char , - .





memcpy :





memcpy(void *dest, const void *source, size_t n);
      
      



n- , source, , dest.





, :





#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    char *msg = malloc(20);
    long int l = 16;
    memcpy(msg, &l, 4);
    char *c1 = "Hello world!!!\n"; /* length 15 symbols + 1 '\0' symbol */
    memcpy(msg + 4, c1, 16);
    
    
    long int l2 = 0;
    memcpy(&l2, msg, 4);
    char *c2 = malloc(l2);
    memcpy(c2, msg + 4, l2);
    
    
    printf("Str: %s\nLength: %d\n", c2, l2);
    
    free(msg);
    free(c2);
}
      
      



. 20 . 4 , 16 . l . memcpy msg. 4 msg . c1, . 16, '\0'



. , memcpy, 5 msg , c1, , , .. l.





, , : l2 c2. C memcpy l2 msg. c2 msg, msg, , l2, .





, printf, l2 c2. ,





Str: Hello world!!!

Length: 16
      
      



, . memcpy , char.





memcpy: , , . , , .





, .

:





char *mystr = "This is my string\n";
mystr = mystr + 13;
*mystr = 'u';
      
      



Segmentation Fault. , mystr . , .text , . , , mystr , .





malloc, , . - , , . mystr 19 .





free

malloc calloc , .. , , . main, exit , , , , , (, , _exit, , ).





, ? , , , . free , (.. ) :





char *s1 = malloc(255);
process(s1);
free(s1);
      
      



, process s1. process , .. 255 , s1. s1, . process :





process(char *s);
      
      



, free :





s1 = s1 + 1;
      
      



s1, , s1 1 . free, s1 , .





: , , free, .





, , , :





void process_person(struct Person *p){
	char name[] = "El Barto\0";
  p->name = name;
  printf("Person name: %s was initiated\n", p->name);
}
      
      



Person, :





struct Person {
	char *name;
};
      
      



, main, , Person, (name) process_person:





/* in main() body */
struct Person p1;
process_person(&p1);
sleep(2);
printf("Person name is: \"%s\"\n", p1.name);
      
      



main, Person , main. process_person, , . , , process_person. name. ( ) name, . , process_person, , 2 . ( sleep). sleep <unistd.h> :





unsigned int sleep(unsigned int seconds);
      
      



2 , , , p1. .. , . :





Person name: El Barto was initiated 
Person name is: "
      
      



, , , - process_person p1.name , \'0'



.





, , , - :





Person name: El Barto was initiated
Person name is: "ElBar2#1"
      
      



, :





" , ."





.. . .. f, () f. , . , g f, g , f, , , f, g.





Por supuesto, cuando ocurren errores, es posible cambiar el flujo de control del código, es decir transición del cuerpo de una función al cuerpo de otra. En este caso, en tales situaciones, puede utilizar variables globales con funciones globales.





PD En esta publicación, solo se consideraron 4 tipos de errores. Hay otras situaciones de error que pueden ocurrir con más frecuencia que las descritas anteriormente.








All Articles