ProgramaciónDesarrollador C

¿Cómo se implementa el trabajo con cadenas en C? Explique la diferencia entre un array de caracteres y un puntero a una cadena. ¿Cómo evitar errores al trabajar con cadenas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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
  • Array de caracteres: Asigna memoria para cada elemento, incluyendo el nulo final. El array puede ser modificado (si no es const).
  • Puntero a cadena: Puede apuntar a un literal de cadena (que no se puede modificar), o a una porción de memoria asignada. El literal de cadena generalmente se coloca en una sección de memoria de solo lectura.

Para evitar errores:

  • Administra correctamente la memoria (usa malloc, strcpy, verifica el tamaño del búfer).
  • No uses literales de cadena para modificar cadenas.
  • Verifica que todas las cadenas terminen con \0.

Ejemplo de trabajo correcto con una cadena:

char buffer[100]; strcpy(buffer, "test"); // OK, buffer es modificable y garantiza contener '\0'

Pregunta trampa

¿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.

Ejemplos de errores reales debido al desconocimiento de los matices del tema


Historia El equipo confundió los conceptos de array de cadena y puntero a literal. Una función aceptaba char *output = "default"; y luego hacía strcpy(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.