在C11中考虑以下类型,其中MyType1和MyType2是先前声明的类型:
typedef struct {
int tag;
union {
MyType1 type1;
MyType2 type2;
}
} MyStruct;
我希望使用malloc
分配足够的内存来保存tag
属性和type1
。这可以通过便携方式完成吗?我想,由于对齐问题,sizeof(tag) + sizeof(type1)
可能无效。
我可以用便携方式从结构的开头计算type1的偏移量吗?
答案 0 :(得分:3)
您可以使用offsetof()
,因为这将包括tag
的大小和任何填充,它足以添加type1
的大小:
void *mys = malloc(offsetof(MyStruct, type1) + sizeof (MyType1));
答案 1 :(得分:1)
我可以从开头计算type1的偏移量 结构以便携的方式?
您可以使用offsetof
中的stddef.h
进行此操作。
printf("Offset of type1 in the struct: %zu\n", offsetof(MyStruct, type1));
旁注:这是有效的,因为您使用的是" 匿名联盟"。如果您要说union { ... } u;
type1
不会成为MyStruct
的成员。