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

时间:2013-05-10 12:56:26

标签: c struct ansi libev

关于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, How to pass arguments to relevant callbacks和许多其他地方的libev用户数据技巧确实假设结构中的第一个字段位于偏移量0 ...真的是可移植的吗?)

1 个答案:

答案 0 :(得分:19)

从C99标准部分6.7.2.1要点13:

  

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

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