technorati 標籤:
c語言,
結構體,
自引用,
相互引用,
self reference,
mutual reference
結構體的自引用(self reference),就是在結構體內部,包含指向自身型別結構體的指標。
結構體的相互引用(mutual reference),就是說在多個結構體中,都包含指向其他結構體的指標。
1.1 不使用typedef時
錯誤的方式:
struct tag_1;
這種宣告是錯誤的,因為這種宣告實際上是乙個無限迴圈,成員b是乙個結構體,b的內部還會有成員是結構體,依次下去,無線迴圈。在分配記憶體的時候,由於無限巢狀,也無法確定這個結構體的長度,所以這種方式是非法的。
正確的方式:(使用指標):
struct tag_1;
由於指標的長度是確定的(在32位機器上指標長度為4),所以編譯器能夠確定該結構體的長度。
1.2 使用typedef 時
錯誤的方式:
typedef struct node;
這裡的目的是使用typedef為結構體建立乙個別名nodep。但是這裡是錯誤的,因為型別名的作用域是從語句的結尾開始,而在結構體內部是不能使用的,因為還沒定義。
正確的方式:
有三種,差別不大,使用哪種都可以。
/* 方法一 */
typedef struct tag_1 node;
/* 方法二 */
struct tag_2;
typedef struct tag_2 node;
struct tag_2;
/* 方法三 */
struct tag_3;
typedef struct tag_3 node;
錯誤的方式:
typedef struct tag_a a;
typedef struct tag_b b;
錯誤的原因和上面一樣,這裡型別b在定義之 前 就被使用。
正確的方式:(使用「不完全宣告」)
/* 方法一 */
struct tag_a;
struct tag_b;
typedef struct tag_a a;
typedef struct tag_b b;
/* 方法二 */
struct tag_a; /* 使用結構體的不完整宣告(incomplete declaration) */
C語言中結構體 自引用 和 相互引用
結構體的自引用 self reference 就是在結構體內部,包含指向自身型別結構體的指標。結構體的相互引用 mutual reference 就是說在多個結構體中,都包含指向其他結構體的指標。1.1 不使用typedef時 錯誤的方式 1 struct tag 1 這種宣告是錯誤的,因為這種宣告...
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...