struct node{
struct node next;
int id;
}
выдает "следующее поле содержит ошибку неполного типа".
что не так с этой структурой?
struct node{
struct node next;
int id;
}
выдает "следующее поле содержит ошибку неполного типа".
что не так с этой структурой?
При создании самореферентного типа данных вам необходимо использовать указатели, чтобы обойти проблемы цикличности:
struct node;
struct node {
struct node * next;
int id;
}
... должен работать, но при его использовании позаботьтесь о правильном распределении памяти.
Почему указатель? Подумайте об этом: смысл определения struct
в том, чтобы компилятор мог выяснить, сколько памяти выделить и к каким частям получить доступ, когда вы говорите node.id
. Если ваша node
структура содержит другую node
структуру, сколько памяти компилятор должен выделить для данного node
?
Используя указатель, вы обойдете это, потому что компилятор знает, сколько места нужно выделить для указателя.
Если бы структура могла содержать другой экземпляр своего собственного типа, ее размер был бы бесконечным.
Вот почему он может содержать только указатель на свой собственный тип.
Кроме того, в этот момент кода размер структуры неизвестен, поэтому компилятор не может знать, сколько места для нее зарезервировать.
node
, пока обрабатывает его определение.Попробуй это:
struct node;
struct node{
struct node *next;
int id;
};
Некоторые варианты использования неполных типов имеют неправильный формат, например, когда вы пытаетесь объявить объект неполного типа. Однако вы можете объявить указатель на неполный тип (например). В данном случае это как раз то, что здесь нужно:
struct node{
struct node *next;
int id;
};
Проблема в том, что когда компилятор достигает этой строки:
struct node{
struct node next; /* << this line */
компилятор на самом деле не знает, что такое struct node
, потому что вы определяете struct node
.
Как правило, нельзя использовать неопределенный или неполный тип.
struct
будет иметь бесконечный размер из-за самореферентности. Решение - использовать указатель (struct node *next
). ;-)
- person Constantino Tsarouhas; 27.12.2012
Для работы необходимо написать:
typedef struct _node{
struct _node* next;
int id;
}node;