2013-05-10 167 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