如果這個問題看起來太“幼稚”,我提前道歉,但問題是:
這是一個如此簡單的代碼:
#include <iostream>
struct my_struct
{
struct fictitious_name fn_struct;
};
int main()
{
}
它沒有被編譯,因為 fictitive_name 結構沒有定義。
但是如果我這樣重寫它:
#include <iostream>
struct my_struct
{
struct fictitious_name* fn_struct;
};
int main()
{
}
然后一切都好了,代碼編譯好了,但是fictitive_name結構體還是未定義。為什么指向不存在的結構的指標有效?
uj5u.com熱心網友回復:
本宣告
struct fictitious_name fn_struct;
引入不完整型別struct fictitious_name。也就是說,這種型別的物件的大小是未知的。因此,編譯器不知道要為物件保留多少記憶體fn_struct。
在本宣告中
struct fictitious_name* fn_struct;
還引入了不完整型別struct fictitious_name。但是fn_struct具有指標型別的物件的大小是已知的。它是指標的大小。所以物件fn_struct是一個完整的型別。
指標總是完整的型別。
來自 C 標準(6.2.5 型別,第 #20 頁)
指標型別是一個完整的物件型別。
uj5u.com熱心網友回復:
struct my_struct
{
struct fictitious_name fn_struct;
};
這里內部結構的內容放在外部結構中。如果定義未知,則大小未知且無法保留空間。
struct my_struct
{
struct fictitious_name* fn_struct;
};
這里指向內部結構的指標被放入外部結構。指向 struct 的指標具有已知大小,因此沒問題。如果您嘗試訪問內部結構的成員或sizeof在其上使用(malloc例如需要),那么您需要定義。在那之前,它只是一個指標,C 不需要知道更多。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/392681.html
上一篇:BigQuery中Google表格來源的表格更新的日志看起來如何?
下一篇:僅使用指標的輸入陣列
