Yahoo奇摩知識+將於 2021 年 5 月 4 日 (美國東部時間) 終止服務���自 2021 年 4 月 20 日 (美國東部時間) 起,Yahoo奇摩知識+服務將會轉為唯讀模式。其他Yahoo奇摩產品與服務或您的Yahoo奇摩帳號都不會受影響。如需關於Yahoo奇摩知識+ 停止服務以及下載您個人資料的資訊,請參閱說明網頁。
相互參考結構的問題
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.查到資料了,是forward reference,所以可以在宣告前使用。
2 個解答
- ?Lv 56 年前最佳解答
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 已經完成宣告",只要結構內所有變數的大小已知,就能給結構配置記憶體完成宣告,是這樣吧?
基本上是這樣沒錯,更正確的說法是結構內所有變數的「長相」需已知。