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