C标准对结构指针及其第一个成员的说法是什么?

时间:2010-06-13 08:34:46

标签: c struct pointers standards

考虑以下两个struct

struct a
{
    int a;
};

struct b
{
    struct a a_struct;
    int b;
};

以下struct b的实例化:

struct b b_struct;

和这个条件:

if (&b_struct == (struct b*)&b_struct.a_struct)
    printf("Yes\n");

C标准是否要求始终评估为真?

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:5)

在C标准中找不到它,但答案是“是” - C ++标准说:

  

指向POD-struct对象的指针,   用a适当转换   reinterpret_cast,指向它   初始成员(或者如果该成员是   位字段,然后到其中的单位   它驻留),反之亦然。 [注意:   因此可能有未命名的   在POD结构对象中填充,   但必要时不要在它的开头   实现适当的对齐。 ]

由于C和C ++ POD对象必须兼容,因此C必须如此。

答案 2 :(得分:1)

第一个成员面前不得有任何填充。

如果使用了适当的强制转换,则结构的地址与其第一个成员的地址相同。

resource