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

Jam*_*ris 10 c standards struct pointers

考虑以下两点struct:

struct a
{
    int a;
};

struct b
{
    struct a a_struct;
    int b;
};
Run Code Online (Sandbox Code Playgroud)

以下实例struct b:

struct b b_struct;
Run Code Online (Sandbox Code Playgroud)

这个条件:

if (&b_struct == (struct b*)&b_struct.a_struct)
    printf("Yes\n");
Run Code Online (Sandbox Code Playgroud)

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

And*_*rey 12

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


小智 5

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

指向POD结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.[注意:因此,在POD-struct对象中可能存在未命名的填充,但不是在其开头,以实现适当的对齐.]

由于C和C++ POD对象必须兼容,因此C必须相同.