我们有以下结构:
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)这些结构不等于零?
是的,C中结构的第一个元素(或C++,受某些类C条件限制)的偏移量保证为零.
有关参考,请参阅/sf/answers/767101751/中引用的C99标准:
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.结构对象中可能存在未命名的填充,但不是在其开头.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |