AnyCompiler

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;
}
Output
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;
}
Output
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.