AnyCompiler

Structs e Pointers

Quando você tem um pointer para um struct — que é o que malloc retorna ao alocar um — você não pode usar o operador ponto diretamente, já que p.x precisaria que p fosse um struct real, não um pointer para um. O operador -> é um atalho para desreferenciar e depois acessar um campo em um único passo: 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

Como é o erro de compilação real

Usar . em um pointer de struct em vez de -> é um erro genuinamente comum em C, e o compilador o detecta imediatamente. Isso é genuinamente o que o gcc relata — capturado de uma execução real, não escrito para parecer plausível:

#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);
      |                     ^
      |                     ->

O diagnóstico do GCC aqui é incomumente útil — ele nomeia a correção exata. Nem todo erro de compilação deste curso será tão indulgente.

A seguir: pointers para functions — armazenar uma function em si mesma em uma variável, e chamá-la indiretamente.

Practice exercise

Defina struct Point com os campos x e y. Use malloc para criar um Point, fixe x em 3 e y em 4 através do pointer com ->, imprima ambos, depois libere-o com free.