C结构的第一个字段是否始终保证偏移为0?

wil*_*ick 16 c struct ansi libev

关于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;
Run Code Online (Sandbox Code Playgroud)

&myB 保证是同&(myB.myA)在一个可移植的方式?

(更具体地说,Libev中的libev用户数据技巧,如何将参数传递给相关的回调和许多其他地方确实假设结构中的第一个字段位于0的偏移处......是否真的可移植?)

Jer*_*myP 21

从C99标准部分6.7.2.1要点13:

在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.结构对象中可能存在未命名的填充,但不是在其开头.

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