關於結構體的一個問題:
看下面這個結構體的聲明,把它記作A
struct node { int a; float b; struct node *next; }s;
struct node { int a; float b; struct node next; }s;
今天學習《C和指針》第10章,以前,沒注意過這個問題,現在對聲明和定義的理解又深了一點
聲明是要告訴編譯器,這個甜餅機做出來的甜餅有多大,但是甜餅機不是甜餅本身,定義就是甜餅本身!
B中的結構體聲明不正確,是因為編譯器會認為 在 代碼語句 : struct node next 這裡是使用了未定義的標識符,因為此時struct node 這個結構體還沒有聲明成功,為什麼?因為聲明是要告訴編譯器你該給我這個變量預留多大的空間,而此時struct node 結構體的大小並不知道,甜餅機都沒有完成,當然吃不到甜餅啦!
A中的struct node * 是指針類型,我們知道指針類型在windows 32位機器上都是4字節,所以,編譯器分析到代碼句:: struct node *next時,你就可以知道我這個next變量是四個字節,從而完成聲明的工作
你會發現,next的類型換做任意結構體指針,都是可以正確編譯的,比如,struct unknown *next ; 此時雖然 struct unknown並沒有聲明,也是正確的,因為,編譯器此時並不關心具體的標號,我只關心我的工作,那就是分配內存!