2014-03-28 4 views
4

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

struct test_struct           line 1  
{               line 2  
    int val;            line 3 
    struct test_struct *next;        line 4 
};               line 5 

В строке 4, поскольку test_struct даже не полностью (я предполагаю, что структура полностью определена в строке 5 из-за ';', до этого мы не можем сказать, что структура определена), то почему мы не получаем ошибку в строке 4, что test_struct не определен ...?

+2

Поскольку стандарт C указывает, что вы можете это сделать. – TypeIA

ответ

5

Это правда, что struct test_struct не полностью определена до закрытия ;, в Line4 вы только определения указателя к неполному типу, который прекрасно.

Чтобы определить полный объект типа struct test_struct, компилятор должен знать полную информацию об этом объекте. Но для определения указателя на какой-то тип он не нужен.

Например, вы не можете сделать:

struct test_struct           
{               
    int val;            
    struct test_struct value;        
}; 

потому что для определения value, необходима полная информация о типе объекта. Но определить struct test_struct*, это не требуется.

1

В вашем примере вы определяете структуру самонаведения. Структура самоопределения содержит один или несколько указателей (я) для себя (как вы определяете в строке 4)! Структуры с самостоятельной привязкой обычно должны обрабатываться с помощью подпрограмм динамической памяти, таких как free и malloc. В вашем случае вы просто определяете указатель на тип, который обрабатывается во время завершения вашего файла. Во время компиляции компилятор C вычисляет байты памяти, которые ваши указатели должны указывать на то, и в то время ваша структура была определена точно.

Смежные вопросы