Struct con punteros en C: ejercicio resuelto
Struct con punteros en C: ejercicio resuelto
Si buscas struct con punteros en C ejercicio resuelto, aquí tienes la diferencia crítica entre copia superficial (shallow copy, con = o memcpy) y copia profunda (deep copy), y por qué la copia superficial de una struct con miembros puntero es una fuente habitual de errores.
Cuando una struct contiene un char * o cualquier puntero, la copia superficial duplica el puntero pero no los datos apuntados: ambas structs apuntan a la misma memoria y liberar una invalida a la otra.
Enunciado
Define una struct Empleado con campos nombre (puntero dinámico), edad y salario. Implementa:
empleado_crear(nombre, edad, salario): asigna dinámicamente la struct y duplica la cadena.empleado_copiar(src): copia profunda — nueva struct y nueva cadena.empleado_liberar(e): libera la cadena y luego la struct.
Demuestra que modificar la copia no afecta al original.
Solución en C
Resultado esperado
(Las direcciones de puntero serán distintas entre original y copia, demostrando que son copias independientes.)
Errores frecuentes
- Copiar la struct con
copia = *origomemcpy: duplica el punteronombre, no la cadena. Ambas structs apuntan a la misma cadena; liberar una invalida el puntero de la otra. - Liberar
eantes de liberare->nombre: la dirección denombrese pierde con la struct, causando una fuga de memoria. - Usar
strcpysin asignar memoria para el destino:strcpyasume que el destino ya tiene espacio suficiente; sinmallocprevio se corrompe la memoria. - No comprobar el resultado de
mallocpara la cadena: si falla tras haber asignado la struct, hay que liberar la struct antes de devolverNULL.
Aplicación práctica
Este patrón es esencial en cualquier módulo de C que gestione datos con cadenas o buffers dinámicos: registros de bases de datos en memoria, colas de mensajes, sistemas de caché y cualquier estructura que deba copiarse o serializarse para enviar a otra función o hilo.
Siguiente ejercicio recomendado
- qsort con structs en C: ejercicio resuelto
- Lista de structs en C: ejercicio resuelto
- Ficheros en C: ejercicios resueltos
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Cuándo es aceptable usar la copia superficial con structs que tienen punteros?
Solo cuando la vida de la copia no supera la del original y se sabe con certeza que el original no se libera mientras la copia esté en uso. En la práctica, es una garantía difícil de mantener; la copia profunda es más segura como regla general.
¿Existe un equivalente de clone o copy constructor en C?
No de forma nativa. El patrón habitual es implementar manualmente una función tipo_copiar(const Tipo *src) que realiza la copia profunda, siguiendo la misma convención que empleado_copiar en este ejercicio.
¿Qué ocurre si se libera la misma memoria dos veces (double free)?
Es comportamiento indefinido. En la práctica suele corromper las estructuras internas del allocator (heap), lo que puede provocar fallos de segmentación, bucles infinitos o vulnerabilidades de seguridad. Para detectarlo, herramientas como Valgrind o AddressSanitizer (gcc -fsanitize=address) son indispensables.