結構體的巢狀問題

2021-08-22 14:43:16 字數 2020 閱讀 3809

結構體的自引用(self reference),就是在結構體內部,包含指向自身型別結構體的指標

結構體的相互引用(mutual reference),就是說在多個結構體中,都包含指向其他結構體的指標

1.1不使用typedef時

錯誤的方式:

struct tag_1;
這種宣告是錯誤的,因為這種宣告實際上是乙個無限迴圈,成員a是乙個結構體,a的內部還會有成員是結構體,依次下去,無線迴圈。在分配記憶體的時候,由於無限巢狀,也無法確定這個結構體的長度,所以這種方式是非法的。

正確的方式:(使用指標

struct tag_1;由於指標的長度是確定的(在32位機器上指標長度為4),所以編譯器能夠確定該結構體的長度。
1.2 使用typedef 時

錯誤的方式:

typedef struct  node;

這裡的目的是使用typedef為結構體建立乙個別名node。但是這裡是錯誤的,因為型別名的作用域是從語句的結尾開始,而在結構體內部是不能使用的,因為還沒定義。

正確的方式:有三種,差別不大,使用哪種都可以。

typedef struct tag_1 node;

struct tag_2;

typedef struct tag_2 node;

struct tag_2;

struct tag_3;

typedef struct tag_3 node;

2. 相互引用 結構體

錯誤的方式:

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;

struct tag_b;

typedef struct tag_a a;

typedef struct tag_b b;

struct tag_a;

struct tag_b;巢狀結構體時應注意:結構體的自引用中,如下這種情況是非法的

struct s_ref ;

因為結構體內部又包含自身結構體型別b,這個長度不能確定,只能向下再查詢,又包含自身結構體型別b,又再向下查詢,如此迴圈,類似於永無出口的遞迴呼叫,是非法的。

但很多時候,的確需要使用到自引用,有個技巧,如下:

struct s_ref ;

這是合法的,因為此處是定義了乙個指向結構體的指標,指標的大小在具體的機器平台和編譯器環境中都是已知的(即使不同的平台環境的定義不完全相同)。所以不會導致上述的遞迴死迴圈。是合法和可行的。但是要提醒的是:這個指標看似指向自身,其實不是,而是指向同一型別的不同結構實體這裡有一種情況值得注意:

typedef struct s_ref ;

這個結構體型別定義是為了定義型別名s_ref,但卻失敗了。因為結構體中就引用了結構型別名,而此時還沒定義型別名。

可以改為如下:

typedef struct s_ref_ts_ref ;

這裡將執行良好。

listview巢狀問題

publicstaticvoidsetlistviewheightbasedonchildren listview listview inttotalheight 0 for inti 0,len listadapter.getcount i len i viewgroup.layoutparams...

信封巢狀問題

給n個信封的長度和寬度。如果信封a的長和寬都小於信封b,那麼信封a可以放到信封b裡,請求出信封最多可以巢狀多少層。輸出包含多行,第一行包括乙個整數,代表信封的個數n 1 n 100000 接下來n行,每行兩個整數li和wi 代表信封的長度和寬度 1e9 include includeusing na...

CDATA巢狀問題

在cdata內部的所有內容都會被解析器忽略。乙個 cdata 部件以 標記結束。但是cdata是不能夠巢狀的。因cdata巢狀導致的xml解析錯誤的問題,參考網上處理方式,解決這個問題只需要將 替換成 替換後文字作為cdata引數傳入,將原cdata識別為多個cdata,自動連線後返回。多層巢狀同理...