Yahoo奇摩知識+將於 2021 年 5 月 4 日 (美國東部時間) 終止服務���自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+服務將會轉為唯讀模式。其他Yahoo奇摩產品與服務或您的Yahoo奇摩帳號都不會受影響。如需關於Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。

?
Lv 5
? 發問時間: 電腦與網際網路程式設計 · 6 年前

相互參考結構的問題

2個結構相互參考

struct A{

struct B *a;

};

struct B{

struct A *b;

};

1.請問指標大小:

32位元系統為4bytes

64位元系統為8bytes

一定是這樣嗎?

2.struct A{...}之前需要加上struct B;嗎?

3.若struct B *a;改為struct B a;為何編不過?

4.為何struct C編得過

struct A{

struct B *a;

};

struct B{

struct C *b;

};

struct C{

struct A c;

};

5.相互參考結構有哪些應用

已更新項目:

2.沒加struct B;但gcc編過了,莫非是bug?

4."他所用到的 struct A 已經完成宣告"

只要結構內所有變數的大小已知,就能給結構配置記憶體完成宣告,是這樣吧?

2 個已更新項目:

2.查到資料了,是forward reference,所以可以在宣告前使用。

http://zh.wikipedia.org/zh-tw/%E5%89%8D%E5%90%91%E...

2 個解答

評分
  • ?
    Lv 5
    6 年前
    最佳解答

    1.請問指標大小:32位元系統為4bytes,64位元系統為8bytes,一定是這樣嗎?

    大概吧!有知道例外的人請出個聲。

    2.struct A{...}之前需要加上struct B;嗎?

    你覺得呢?你不加,編譯器怎麼知道 struct B 是什麼東西?

    3.若struct B *a;改為struct B a;為何編不過?

    因為編譯器不知道 struct B 長什麼樣子;但若宣告成指標的話,編譯器就不需要知道他實際的長相,只要知道他是個整數就可以了,所以才會編譯通過。

    4.為何struct C編得過

    因為在 struct C 之前,他所用到的 struct A 已經完成宣告,編譯器認得他。

    5.相互參考結構有哪些應用

    任何有關「相互」參考、引用等等的事情,當作腦筋運動玩玩,知道他們可以這樣子變化就好;實際應用上請千萬不要使用任何的相互參考,包含標頭檔等等。

    2014-12-24 23:20:04 補充:

    2.沒加struct B;但gcc編過了,莫非是bug?

    可能是因為 struct B 本身就算個宣告的關係。

    4."他所用到的 struct A 已經完成宣告",只要結構內所有變數的大小已知,就能給結構配置記憶體完成宣告,是這樣吧?

    基本上是這樣沒錯,更正確的說法是結構內所有變數的「長相」需已知。

  • 6 年前

    體育 遊戲 -- 全世界網球)、籃球(NBA)、棒球(MLB)、美足、冰球、足球等遊戲

    http://ts777.cc/

還有問題?馬上發問,尋求解答。