嵌套结构作为其他结构中的第一个定义是否具有零偏移量?

zdo*_*zdo 3 c struct

我们有以下结构:

struct parent {
    char *name;
};

struct child {
    struct parent parent;
    int other_child_specific_data;
};
Run Code Online (Sandbox Code Playgroud)

而且我们还有以下功能struct parent:

void print_parent_name(struct parent *p)
{
    printf("%s\n", p->name);
}
Run Code Online (Sandbox Code Playgroud)

问题:我可以肯定,调用这样的函数:

struct child c;
c.parent.name = "Child #1";

print_parent_name(&c);
Run Code Online (Sandbox Code Playgroud)

永远是相同的

print_parent_name(&c + offsetof(struct child, parent));
Run Code Online (Sandbox Code Playgroud)

换句话说,问题是:如果作为第一个定义放在?那么offsetof(struct child, parent) 总是等于零?struct parent parentstruct child

可能有人可以给C标准参考吗?是否有这样的硬件或软件配置使offsetof(struct child, parent)这些结构不等于零?

Joh*_*nck 5

是的,C中结构的第一个元素(或C++,受某些类C条件限制)的偏移量保证为零.

有关参考,请参阅/sf/answers/767101751/中引用的C99标准:

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