En el lenguaje C, las cadenas se implementan como arrays de caracteres que terminan con un byte nulo ('\0'). Ejemplo de declaración de una cadena:
char str1[] = "hello"; // Array con 6 caracteres: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Puntero a un literal de cadena
const).Para evitar errores:
malloc, strcpy, verifica el tamaño del búfer).\0.Ejemplo de trabajo correcto con una cadena:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer es modificable y garantiza contener '\0'
¿Qué resultado dará la ejecución del siguiente código y a qué errores conducirá?
char *str = "hello"; str[0] = 'H'; printf("%s ", str);
Respuesta: El programa conducirá a un comportamiento indefinido, probablemente a un segfault, porque los literales de cadena se colocan en un área de memoria de solo lectura. No se pueden escribir valores en la dirección del literal de cadena.
Historia El equipo confundió los conceptos de array de cadena y puntero a literal. Una función aceptaba
char *output = "default";y luego hacíastrcpy(output, input);, lo que provocaba un fallo en la primera ejecución, porque la copia ocurría en memoria de solo lectura.
Historia Al trabajar con la red, el resultado se escribió en un búfer asignado mediante
char *buf = NULL; strcpy(buf, data);. Esto provocó una escritura en memoria no inicializada y un fallo de la aplicación.
Historia En un paquete de localización, el equipo pasaba cadenas entre componentes sin asegurarse de que se añadiera el carácter
\0. Una vez, una función mostró basura en la consola y dañó la estructura interna de la memoria.