C结构的第一个字段是否总是保证偏移量为0



关于C编程语言…

C/c++结构偏移部分的问题指出"&不总是指向结构"

的第一个字段的第一个字节。

但是看看http://www.lysator.liu.se/c/rat/c5.html上的"ANSI基本原理",它在第3.5.2.1节结构和联合说明符中规定"开始时可能没有洞"。所以我不确定这个"基本原理"是否是决定性的,但它似乎确实与那个非常明显的问题的那一部分相矛盾。

那么,是哪一个呢? C结构的第一个字段总是保证在偏移量为0吗?

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

&myB 是否保证在可移植的方式下与&(myB.myA)相同?

(更具体地说,libbev的user-data技巧,如何将参数传递给相关的回调函数和许多其他地方都假设结构中的第一个字段位于偏移量0…

来自C99标准第6.7.2.1节要点13:

在结构对象中,非位域成员和位域所在的单元驻留的地址按声明顺序递增。指针指向结构对象经过适当转换后,指向其初始成员(或者如果该成员是位域,然后到它所在的单元),反之亦然。可能有未命名的在结构对象内填充,但不在其开头。

因此,你的问题的答案是肯定的。

最新更新