以链接列表定义的结构为例......
struct test_struct line 1
{ line 2
int val; line 3
struct test_struct *next; line 4
}; line 5
在第4行,由于test_struct甚至没有完全定义(我假设结构在第5行完全定义,因为&#39 ;;',之前我们不能说结构是定义的)那么我们怎么样在第4行没有得到错误,即没有定义test_struct ......?
答案 0 :(得分:5)
确实struct test_struct
在结束;
之前没有完全定义,在第4行,你只是定义了一个指向不完整类型的指针,这很好。
要定义类型为struct test_struct
的完整对象,编译器需要知道有关该对象的完整信息。但要定义指向某种类型的指针,则不需要它。
例如,您不能这样做:
struct test_struct
{
int val;
struct test_struct value;
};
因为要定义value
,需要有关对象类型的完整信息。但要定义struct test_struct*
,则不需要。
答案 1 :(得分:1)
在您的示例中,您定义了一个自引用结构。自引用结构包含一个或多个指针(如第4行所定义)!自引用结构通常需要使用动态内存句柄子例程(如free和malloc)来处理。在您的情况下,您只需定义一个指向类型的指针,该类型在文件完成时及时处理。在编译时,C编译器计算指针需要指向的内存字节,并且在那时您的结构已经完全定义。