2013-05-10 16 views
12

關於C語言編程...C結構的第一個字段總是保證在0的偏移量處?

C/C++ Structure offset質詢的規定,「&並不總是在結構的第一個字段的第一個字節點」

但看在「ANSI理由「在http://www.lysator.liu.se/c/rat/c5.html它聲明」3.5.2.1結構和聯合說明符在開始時不會出現孔「。所以我不確定這個「基本原理」是否是確定性的,但它確實與這個非常明顯的問題的部分矛盾。

那麼,這是什麼? C結構的第一個字段總是保證在0的偏移量?

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    struct A myA; 
    int y; 
}; 

B myB; 

&myB保證是一樣&(myB.myA)在便攜式的方式?

(更具體地說,在Libev, How to pass arguments to relevant callbacks和其他許多地方的libev用戶數據伎倆並不認爲在結構中的第一場是在offsetof 0 ...是真的便攜式?)

+2

我很確定它在C中是真的;在C++中,這對於標準佈局類是正確的。 – 2013-05-10 12:57:41

+0

我很*很確定這也是真的,我只是不知道相關的標準引用。可移植性是我的問題。這對我嘗試過的所有東西都有效,但是這會在我還沒有看到的平臺上困擾我嗎? – wilsonmichaelpatrick 2013-05-10 13:00:25

+0

@KerrekSB:vtable位於哪裏?在一開始的時候? (C++) – Alex 2013-05-10 13:00:53

回答

18

C99標準節6.7.2.1項目符號點13:

內的結構對象,非位字段構件和單元,其中位字段 駐留具有在其聲明的順序增加的地址。指向適當轉換的 結構對象的指針指向其初始成員(或者如果該成員是位域,則返回其所在的單位),反之亦然。在結構對象中可能存在未命名的 填充,但不在其開始處。

因此,您的問題的答案是肯定的。

+0

謝謝,這就是答案,我只是不知道要搜索什麼,我的搜索引擎點擊是誤導性的。我會在一會兒讓我接受它。 – wilsonmichaelpatrick 2013-05-10 13:09:12

+0

@wilsonmichaelpatrick其中一個問題是C標準不能在Internet上免費獲得。你通常必須爲他們支付(相當多)。我設法在這裏找到C99的副本http://www.open-std.org/jtc1/sc22/wg14/www/standards它在技術上是一份工作文件,但它足夠好。 – JeremyP 2013-05-10 13:25:21

+0

@wilsonmichaelpatrick只是爲了過度瑣碎:這並不能保證'(uintptr_t)&myB ==(uintptr_t)&myB.myA'。 [但是你需要一個有意識的邪惡執行才能達到這種平等。] – 2013-05-10 13:45:14

相關問題