/ / Próximo item de estrutura, tipo incompleto [duplicado] - c, estrutura, lista vinculada, campo

Próximo item da estrutura, tipo incompleto [duplicado] - c, struct, lista vinculada, campo

struct node{
struct node next;
int id;
}

dá "o campo seguinte tem erro de tipo incompleto".

o que há de errado com essa estrutura?

Respostas:

10 para resposta № 1

Ao criar um tipo de dados autorreferencial, você precisa usar ponteiros para contornar problemas de circularidade:

struct node;

struct node {
struct node * next;
int id;
}

... deve funcionar, mas tome cuidado para alocar memória corretamente ao usá-la.

Por que um ponteiro? Considere o seguinte: o ponto de struct A definição é para que o compilador possa descobrir quanta memória alocar e quais partes acessar quando você diz node.id. Se seu node struct contém outro node struct, quanta memória o compilador deve alocar para um determinado node?

Ao usar um ponteiro, você contorna isso, porque o compilador sabe quanto espaço deve ser alocado para um ponteiro.


5 para resposta № 2

Se uma estrutura poderia contenha outra instância de seu próprio tipo, seu tamanho seria infinito.

É por isso que ele pode conter apenas um ponteiro ao seu próprio tipo.

Além disso, nesse ponto do código, o tamanho da estrutura é desconhecido; portanto, o compilador não pode saber quanto espaço reservar para ele.


2 para resposta № 3
  1. Você precisa fazer uma declaração direta do nó, pois o compilador não sabe node no entanto, enquanto processa sua definição.
  2. Você provavelmente pretendia armazenar um ponteiro, não um objeto de nó.

Tente isto:

struct node;

struct node{
struct node *next;
int id;
};

1 para resposta № 4

Alguns usos de tipos incompletos são mal formados,como quando você tenta declarar um objeto de um tipo incompleto. No entanto, você pode declarar um ponteiro para um tipo incompleto (por exemplo). Nesse caso, é exatamente o que é necessário aqui:

struct node{
struct node *next;
int id;
};

0 para a resposta № 5

O problema é que, quando o compilador atinge esta linha:

struct node{
struct node next;  /* << this line */

o compilador realmente não sabe o que é struct node, porque você está definindo struct node.

Em geral, você não pode usar um tipo que não esteja definido ou incompleto.


0 para a resposta № 6

Para funcionar, você deve escrever:

typedef struct _node{
struct _node* next;
int           id;
}node;