2014-03-28 25 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沒有完全閉合之前;定義,在4號線你只定義指向不完全類型,這是罰款。

要定義類型爲struct test_struct的完整對象,編譯器需要知道有關該對象的完整信息。但是要定義一個指向某種類型的指針,這不是必需的。

例如,你不能做:

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

因爲定義value,需要有關對象的類型的完整信息。但要定義struct test_struct*,這不是必需的。

1

在你的例子中你定義了一個自引用結構。自引用結構包含一個或多個指向自身的指針(如您在第4行中定義的那樣)!自引用結構通常需要使用動態內存句柄子例程(如free和malloc)來處理。在你的情況下,你只需定義一個指向你的文件完成時及時處理的類型的指針。在編譯時,C編譯器會計算指針需要指向的內存字節,並且此時您的結構已經完全定義。