Это тот же случай, как с упреждающим объявлением типа класса/структурами:
struct node;
struct node* node_ptr; /* is valid */
struct node node_instance; /* is invalid */
Так struct node;
в основном говорит: эй есть структура, определенная где-то за пределами этого файла. Тип действителен, указатели могут использоваться, но вы не можете создать экземпляр объекта.
Это связано с тем, что размер указателя известен и специфичен для целевой архитектуры (например, 32 или 64-разрядной). Размер структуры неизвестен до объявления.
При объявлении типа completey, то вам будет позволено объявить объект этого типа:
struct node {
int a;
struct node* b; /* this will work, but the size of struct is unknown yet */
}
struct node* node_ptr; /* this works always with full and forward declarations */
struct node node_object; /* now, the size of struct is known, so the instance may be created */
Да, я исправился, что –