第一个元素偏移

它是保证,结构的第一个元素的偏移是0吗? 为了更准确,我们考虑一下

struct foo { int a; double b; }; struct foo *ptr=malloc(sizeof(struct foo)); int *int_ptr = &ptr->a; free(int_ptr) 

在任何操作系统或任何其他因素下,它是否始终有效?

是的,它是有保证的。 会给你一个标准报价,让我查找。

C99标准:§6.7.2.1

第12段

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