1.1 不使用typedef時
錯誤的方式:
struct tag_1{ struct tag_1 A; int value;};// 這種聲明是錯誤的,因為這種聲明實際上是一個無限循環,成員A是一個結構體,A的內部還會有成員是結構體,依次下去,無線循環。//在分配內存的時候,由于無限嵌套,也無法確定這個結構體的長度,所以這種方式是非法的。正確的方式: (使用指針)
struct tag_1{ struct tag_1 *A; int value;};// 由于指針的長度是確定的(在32位機器上指針長度為4),所以編譯器能夠確定該結構體的長度。1.2 使用typedef 時
錯誤的方式:
typedef struct { int value; NODE *link; } NODE;//這里的目的是使用typedef為結構體創建一個別名NODE。但是這里是錯誤的,因為類型名的作用域是從語句的結尾開始,//而在結構體內部是不能使用的,因為還沒定義。正確的方式:有三種,差別不大,使用哪種都可以。
typedef struct tag_1{ int value; struct tag_1 *link; } NODE;struct tag_2;typedef struct tag_2 NODE;struct tag_2{ int value; NODE *link; };struct tag_3{ int value; struct tag_3 *link; };typedef struct tag_3 NODE;2. 相互引用 結構體
錯誤的方式:
typedef struct { int value; NODE *link; } NODE;//這里的目的是使用typedef為結構體創建一個別名NODE。但是這里是錯誤的,因為類型名的作用域是從語句的結尾開始,//而在結構體內部是不能使用的,因為還沒定義。正確的方式:(使用“不完全聲明”)struct tag_a{ struct tag_b *bp; int value;};struct tag_b{ struct tag_a *ap; int value;};typedef struct tag_a A;typedef struct tag_b B;struct tag_a; struct tag_b;typedef struct tag_a A;typedef struct tag_b B;struct tag_a{ struct tag_b *bp; int value;};struct tag_b{ struct tag_a *ap; int value;};//
新聞熱點
疑難解答