Puntero a struct en C: ejercicio resuelto
Puntero a struct en C: ejercicio resuelto
Si buscas puntero a struct en C ejercicio resuelto, aquí tienes la diferencia entre acceso por valor (s.campo) y acceso por puntero (p->campo), junto con la asignación dinámica de structs con malloc.
El operador flecha -> es equivalente a desreferenciar el puntero y acceder al campo: p->campo es azúcar sintáctico para (*p).campo.
Enunciado
Define una struct Producto con campos nombre (cadena de 32 caracteres), precio (double) y stock (int). Crea una función que reciba un puntero a Producto, aplique un descuento porcentual al precio y reduzca el stock en 1. Muestra el resultado tanto con acceso estático como dinámico.
Solución en C
Resultado esperado
Errores frecuentes
- Usar
.en lugar de->con un puntero:p.preciocon unProducto *es un error de compilación; se necesitap->precio. - No inicializar todos los campos antes de imprimir:
mallocno inicializa la memoria; los campos pueden tener valores basura. - No comprobar el resultado de
malloc: si devuelveNULLy se accede al puntero, el programa termina con fallo de segmento. - Olvidar
free(b)al final: cadamallocdebe tener sufreecorrespondiente para evitar fugas de memoria.
Aplicación práctica
Los punteros a structs son el patrón central de la programación en C con datos complejos: listas enlazadas, árboles, tablas hash y módulos de software que pasan estructuras grandes entre funciones sin copiarlas. Pasar const Producto * es más eficiente que pasar Producto por valor cuando la struct es grande.
Siguiente ejercicio recomendado
- const pointer en C: ejercicio resuelto
- Struct y ficheros en C: ejercicio resuelto
- Calloc en C: ejercicio resuelto
- 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 usar struct por valor y cuándo por puntero?
Usa por valor cuando la struct es pequeña (1–2 campos numéricos) y no necesitas modificarla en la función llamada. Usa por puntero cuando la struct es grande (evita copiar), cuando necesitas modificar sus campos en la función o cuando se trata de nodos de una estructura dinámica (lista, árbol).
¿Qué diferencia hay entre malloc(sizeof(Producto)) y declarar Producto b?
Producto b asigna la struct en la pila (stack), que se libera automáticamente al salir del bloque. malloc asigna en el montón (heap), con vida independiente del bloque donde se creó, pero requiere free explícito. El heap es adecuado cuando la vida de la struct debe superar a la función que la creó.
¿Se puede tener un array de punteros a struct?
Sí: Producto *catalogo[100] es un array de 100 punteros, cada uno apuntando a un Producto asignado independientemente. Es útil cuando las structs tienen tamaños distintos (con herencia simulada por composición) o cuando quieres reubicarlas con realloc sin invalidar los punteros externos.