【 C 】結構的自引用
阿新 • • 發佈:2018-12-09
在學習連結串列的時候用到了結構的自引用,這裡學習一下:
《C和指標》對結構的自引用的分析還比較清晰!這裡做筆記記錄下:
在一個結構內部包含一個型別為該結構體本身的成員是否合法呢?下面給出一個例子,僅供判斷:
struct SELE_REF1 {
int a;
struct SELF_REF1 b;
int c;
}
這種型別的自引用是非法的,因為成員b是另一個完整的結構,其內部還將包含它自己的成員b。這樣重複下去永無止境。這有點像永不會終止的遞迴程式。
但下面的這個宣告是合法的:
struct SELF_REF2{ int a; struct SEF_REF2 *b; int c; }
那為什麼這個宣告就是合法的呢?
這個宣告和上面那個宣告的區別就是b現在是一個指標而不是結構。編譯器在結構的長度確定之前就已經知道指標的長度,所以這種型別的自引用是合法的。
警惕這個陷阱:
typedef struct {
int a;
SELF_REF3 *b;
int c;
} SELF_REF3;
這個宣告的目的是為這個結構建立一個型別名SELF_REF3。但是它失敗了,原因是型別名直到宣告的末尾才定義,所以在結構宣告的內部它尚未定義,怎麼就可以使用了呢?
解決方案是定義一個結構標籤來宣告b,如下:
typedef struct TAG{ int a; TAG *b; int c; } SELF_REF3;
這樣才是沒有問題的!