如何为嵌入在结构中的联合的特定成员可移植地分配 space
How to portably allocate space for a particular member of a union embedded in a struct
考虑 C11 中的以下类型,其中 MyType1 和 MyType2 是先前声明的类型:
typedef struct {
int tag;
union {
MyType1 type1;
MyType2 type2;
}
} MyStruct;
我想使用 malloc
分配足够的内存来保存 tag
属性和 type1
。这可以以便携的方式完成吗?我想,sizeof(tag) + sizeof(type1)
可能由于对齐问题而无法工作。
我能以可移植的方式计算 type1 从结构开头的偏移量吗?
Can I calculate the offset of type1 from the beginning of the
structure in a portable way?
您可以使用 stddef.h
中的 offsetof
来完成此操作。
printf("Offset of type1 in the struct: %zu\n", offsetof(MyStruct, type1));
旁注:之所以可行,是因为您使用的是“匿名联盟”。如果你说 union { ... } u;
type1
不会是 MyStruct
的成员。
您可以使用 offsetof()
,因为这将包括 tag
的大小和任何填充,然后添加 type1
的大小就足够了:
void *mys = malloc(offsetof(MyStruct, type1) + sizeof (MyType1));
考虑 C11 中的以下类型,其中 MyType1 和 MyType2 是先前声明的类型:
typedef struct {
int tag;
union {
MyType1 type1;
MyType2 type2;
}
} MyStruct;
我想使用 malloc
分配足够的内存来保存 tag
属性和 type1
。这可以以便携的方式完成吗?我想,sizeof(tag) + sizeof(type1)
可能由于对齐问题而无法工作。
我能以可移植的方式计算 type1 从结构开头的偏移量吗?
Can I calculate the offset of type1 from the beginning of the structure in a portable way?
您可以使用 stddef.h
中的 offsetof
来完成此操作。
printf("Offset of type1 in the struct: %zu\n", offsetof(MyStruct, type1));
旁注:之所以可行,是因为您使用的是“匿名联盟”。如果你说 union { ... } u;
type1
不会是 MyStruct
的成员。
您可以使用 offsetof()
,因为这将包括 tag
的大小和任何填充,然后添加 type1
的大小就足够了:
void *mys = malloc(offsetof(MyStruct, type1) + sizeof (MyType1));