18

关于C编程语言...

C/C++ Structure offset的部分问题指出“& 并不总是指向结构的第一个字段的第一个字节”

但是查看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)便携方式一样吗?

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

4

1 回答 1

24

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

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

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

于 2013-05-10T13:06:19.517 回答