ProgramaciónDesarrollador Backend C

Describa las características del trabajo con la operación de asignación de estructuras en el lenguaje C. ¿Cómo se copian las estructuras, cuáles son las ventajas y limitaciones, qué errores son posibles?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

C soporta la asignación directa de una estructura a otra del mismo tipo: todos los campos se copian byte a byte (memcpy). Esto es conveniente para clonar rápidamente una estructura, por ejemplo:

struct Point { int x, y; }; struct Point p1 = {10, 20}; struct Point p2; p2 = p1; // Ahora p2.x=10, p2.y=20

Características:

  • Todos los campos se copian "as is" (bit a bit).
  • Si los campos son punteros/arreglos, solo se copia el puntero en sí, no el contenido en esa dirección (no se realiza una copia profunda!).
  • La asignación solo funciona para estructuras del mismo tipo.

Pregunta engañosa

"¿Qué sucederá si la estructura contiene un puntero a memoria dinámica y asigna una estructura a otra?"

Muchos piensan que se copiará todo el contenido, pero no es así.

Respuesta: Solo se copiará el valor del puntero (la dirección), no los datos en esa dirección. Ambos objetos de la estructura apuntarán a la misma memoria.

struct Data { int *arr; }; struct Data d1; d1.arr = malloc(10 * sizeof(int)); struct Data d2 = d1; // d2.arr == d1.arr

Al cambiar d2.arr, se cambia la memoria que ve d1.arr.

Ejemplos de errores reales por desconocer los detalles del tema


Historia 1

Serialización de datos: se asignó una estructura con un búfer interno de puntero (malloc) — después de la copia, dos objetos diferentes apuntaban a la misma memoria, y al liberar ambos llamaron a free(). Resultado: doble liberación y caída del servicio.


Historia 2

En un intento de clonar una estructura compleja, olvidé hacer una copia profunda de los campos punteros. Después de modificar la copia, esperábamos independencia, pero alterábamos el original (y viceversa), perdiendo la consistencia de los datos.


Historia 3

Almacenamos una estructura con un puntero anidado a una cadena. Asignamos la estructura, y después liberamos una de las cadenas, y la otra estructura de repente se "rompió" (puntero colgante), el programa empezó a comportarse de manera impredecible.