簡體   English   中英

struct name是否指向第一個元素?

[英]Are struct names pointers to first element?

我發現了一些類似的問題,但沒有一個問題有多大幫助。 struct name是指向struct的第一個元素的指針,類似於數組嗎?

struct example {
    int foo;
    int bar;
};

struct example e;
e.foo = 5;
e.bar = 10;
printf("%d\n%d\n%d\n%d\n%d\n%d\n", e, e.foo, e.bar, &e, &e.foo, &e.bar);

輸出:

5
5
10
2033501712
2033501712
2033501716

其他問題的所有答案都說“不”,但這個輸出讓我感到困惑。 非常感謝所有的幫助。

struct的地址確實是第一個元素的地址,但是您需要知道元素的類型才能安全地轉換它。

(C17§6.7.2.1.15:“指向結構對象的指針,適當轉換,指向其初始成員......反之亦然。結構對象中可能有未命名的填充,但不是在其開頭。”)

雖然它很丑陋,但許多生產軟件依賴於此。 例如,QNX在編寫資源管理器時在開放控制塊(OCB)邏輯中使用這種行為。 Gtk也有類似的東西。

您當前的實施是危險的。 如果你必須依賴這種行為,那么就這樣做,並且不要試圖將指向結構的指針作為參數傳遞給printf() ,因為你有意破壞了一種語言特性而且類型安全性最小。

struct example {
    int foo;
    int bar;
};

struct example myStruct = { 1, 2 };
int* pFoo = (int*)&myStruct;
printf("%d", *pFoo);

最后,這只適用於第一個元素。 后續元素可能不是您期望它們的情況, 即由於struct打包和填充

struct名稱不是指向任何東西的指針。 您通過使用不兼容的格式說明符%dstruct傳遞給printf來調用未定義的行為 它似乎“工作”,因為結構的第一個成員具有與struct本身相同的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM