1. 程式人生 > >【 C 】結構的自引用

【 C 】結構的自引用

在學習連結串列的時候用到了結構的自引用,這裡學習一下:

《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;

這樣才是沒有問題的!