結構體的自引用(self reference),就是在結構體內部,包含指向自身型別結構體的指標。
結構體的相互引用(mutual reference),就是說在多個結構體中,都包含指向其他結構體的指標。
1.1 不使用typedef時
錯誤的方式:
1struct
tag_1;
這種宣告是錯誤的,因為這種宣告實際上是乙個無限迴圈,成員b是乙個結構體,b的內部還會有成員是結構體,依次下去,無線迴圈。在分配記憶體的時候,由於無限巢狀,也無法確定這個結構體的長度,所以這種方式是非法的。
正確的方式:(使用指標):
1struct
tag_1;
由於指標的長度是確定的(在32位機器上指標長度為4),所以編譯器能夠確定該結構體的長度。
1.2 使用typedef 時
錯誤的方式:
1 typedef structnode;
這裡的目的是使用typedef為結構體建立乙個別名nodep。但是這裡是錯誤的,因為型別名的作用域是從語句的結尾開始,而在結構體內部是不能使用的,因為還沒定義。
正確的方式:
有三種,差別不大,使用哪種都可以。
1/*方法一
*/2 typedef struct
tag_1 node;67
8/*方法二 */9
struct
tag_2;
10 typedef struct
tag_2 node;
11struct
tag_2;
1516
17/*
方法三
*/18
struct
tag_3;
22 typedef struct tag_3 node;
錯誤的方式:
1 typedef structtag_a a;
56 typedef struct
tag_b b;
錯誤的原因和上面一樣,這裡型別b在定義之 前 就被使用。
正確的方式:(使用「不完全宣告」)
1/*方法一 */2
struct
tag_a;
6struct
tag_b;
10 typedef struct
tag_a a;
11 typedef struct
tag_b b;
1213
14/*
方法二
*/15
struct tag_a; /*
使用結構體的不完整宣告(incomplete declaration)
*/16
struct
tag_b;
17 typedef struct
tag_a a;
18 typedef struct
tag_b b;
19struct
tag_a;
23struct
tag_b;
C語言中結構體 自引用 和 相互引用
technorati 標籤 c語言,結構體,自引用,相互引用,self reference,mutual reference 結構體的自引用 self reference 就是在結構體內部,包含指向自身型別結構體的指標。結構體的相互引用 mutual reference 就是說在多個結構體中,都包含...
C語言中結構體 自引用 和 相互引用
結構體的自引用 self reference 就是在結構體內部,包含指向自身型別結構體的指標。結構體的相互引用 mutual reference 就是說在多個結構體中,都包含指向其他結構體的指標。1.1 不使用typedef時 錯誤的方式 1 struct tag 1 這種宣告是錯誤的,因為這種宣告...
C語言複習 自引用結構體
測試 include include int main struct student p,q,r,current p struct student malloc sizeof struct student q struct student malloc sizeof struct student r...