結構體的自引用(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;2. 相互引用 結構體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;
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,自動連線後返回。多層巢狀同理...