Следующий элемент структуры, неполный тип

struct node{  
    struct node next;  
    int id;  
}

выдает "следующее поле содержит ошибку неполного типа".

что не так с этой структурой?


person Qxtrml    schedule 04.11.2010    source источник


Ответы (6)


При создании самореферентного типа данных вам необходимо использовать указатели, чтобы обойти проблемы цикличности:

struct node;

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

... должен работать, но при его использовании позаботьтесь о правильном распределении памяти.

Почему указатель? Подумайте об этом: смысл определения struct в том, чтобы компилятор мог выяснить, сколько памяти выделить и к каким частям получить доступ, когда вы говорите node.id. Если ваша node структура содержит другую node структуру, сколько памяти компилятор должен выделить для данного node?

Используя указатель, вы обойдете это, потому что компилятор знает, сколько места нужно выделить для указателя.

person detly    schedule 04.11.2010

Если бы структура могла содержать другой экземпляр своего собственного типа, ее размер был бы бесконечным.

Вот почему он может содержать только указатель на свой собственный тип.

Кроме того, в этот момент кода размер структуры неизвестен, поэтому компилятор не может знать, сколько места для нее зарезервировать.

person Martin Broadhurst    schedule 04.11.2010

  1. Вам нужно сделать предварительное объявление узла, поскольку компилятор еще не знает node, пока обрабатывает его определение.
  2. Вероятно, вы хотели хранить указатель, а не сам объект узла.

Попробуй это:

struct node;

struct node{  
    struct node *next;  
    int id;  
};
person EboMike    schedule 04.11.2010
comment
Предварительное объявление не требуется, поскольку объявление структуры действует как собственное предварительное объявление. Проблема полностью в том, что он пытался поместить структуру внутри себя и должен был использовать указатель. - person JeremyP; 04.11.2010

Некоторые варианты использования неполных типов имеют неправильный формат, например, когда вы пытаетесь объявить объект неполного типа. Однако вы можете объявить указатель на неполный тип (например). В данном случае это как раз то, что здесь нужно:

struct node{  
    struct node *next;  
    int id;  
};
person usta    schedule 04.11.2010

Проблема в том, что когда компилятор достигает этой строки:

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

компилятор на самом деле не знает, что такое struct node, потому что вы определяете struct node.

Как правило, нельзя использовать неопределенный или неполный тип.

person Donotalo    schedule 04.11.2010
comment
Собственно, компилятор уже знает об этом. Настоящая проблема в том, что struct будет иметь бесконечный размер из-за самореферентности. Решение - использовать указатель (struct node *next). ;-) - person Constantino Tsarouhas; 27.12.2012

Для работы необходимо написать:

typedef struct _node{
  struct _node* next;
  int           id;
}node; 
person Xxxo    schedule 14.09.2011
comment
Идентификаторы, начинающиеся с подчеркивания, зарезервированы для реализации. - person Flexo; 14.09.2011
comment
awoodland: только подчеркивание + заглавная буква или двойное подчеркивание. - person u0b34a0f6ae; 14.12.2011