2017-07-10 53 views
1

我正在执行我自己的一个类似于Linux的列表list.h,但不想打扰container_of的事。我可以安全地将第一个结构成员的地址解释为整个结构的地址吗?

我读过C编译器不允许对结构成员重新排序,但有没有保证第一个成员的偏移量始终为零?

我可以直接施加一个限制:必须首先声明列表头成员才能通过将头地址转换为容器类型来获得整个结构成员?

+1

是第一个成员的偏移量必须始终为零。任何可能的填充都是在*之后添加的*,所以下一个成员最终会有一个很好的偏移量。 –

+0

@Someprogrammerdude将是真实的,即使我找到无效地址上的结构?例如一个字大小的结构位于奇数地址 – CIsForCookies

+1

@CIsForCookies是。 – tilz0R

回答

6

C standard

6.7.2.1结构和联合说明

15。在结构对象中,非位域成员和位域 所在的单元具有增加它们声明顺序的地址。 指向一个 结构对象,适当地转换,点到其初始构件(或者,如果该部件是 位字段,然后在它所在的单元),反之亦然。在结构对象中可能存在未命名的 填充,但不在其开始处。

重点煤矿

相关问题