C 第一元素偏移量

C 第一元素偏移量,c,malloc,free,offset,C,Malloc,Free,Offset,结构的第一个元素的偏移量为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段 在结构对象中,非位域成员和位域所在的单元

结构的第一个元素的偏移量为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段

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


在任何操作系统或任何其他因素下?我不知道这是否可以回答——语言规范中是否有这一点是另一回事。您的代码不应该读
int*int\u ptr=&ptr->a?§6.7.2.15似乎是正确的:“一个指向结构对象的指针,经过适当转换后,指向它的初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在它的开头。”@DCoder:啊,你在这方面比我强:)