Structs y Pointers
Cuando tienes un pointer a un struct — que es lo que malloc devuelve al asignar uno — no puedes usar el operador punto directamente, ya que p.x necesitaría que p fuera un struct real, no un pointer a uno. El operador -> es una abreviatura para desreferenciar y luego acceder a un campo en un solo paso: p->x significa (*p).x.
#include <stdio.h>
#include <stdlib.h>
struct Point {
int x;
int y;
};
int main() {
struct Point *p = malloc(sizeof(struct Point));
p->x = 3;
p->y = 4;
printf("%d %d\n", p->x, p->y);
free(p);
return 0;
}3 4
Cómo se ve el error de compilación real
Usar . en un pointer a struct en lugar de -> es un error genuinamente común en C, y el compilador lo detecta de inmediato. Esto es genuinamente lo que gcc reporta — capturado de una ejecución real, no escrito para parecer plausible:
#include <stdio.h>
#include <stdlib.h>
struct Point {
int x;
int y;
};
int main() {
struct Point *p = malloc(sizeof(struct Point));
p.x = 3;
printf("%d\n", p.x);
free(p);
return 0;
}main.c: In function ‘main’:
main.c:11:6: error: ‘p’ is a pointer; did you mean to use ‘->’?
11 | p.x = 3;
| ^
| ->
main.c:12:21: error: ‘p’ is a pointer; did you mean to use ‘->’?
12 | printf("%d\n", p.x);
| ^
| ->El diagnóstico de GCC aquí es inusualmente útil — nombra la solución exacta. No todos los errores de compilación de este curso serán tan indulgentes.
A continuación: pointers a funciones — almacenar una función en sí misma en una variable, y llamarla indirectamente.
Practice exercise
Define struct Point con los campos x e y. Usa malloc para crear un Point, fija x en 3 e y en 4 a través del pointer con ->, imprime ambos, luego libéralo con free.