如何为嵌入在结构中的联合的特定成员可移植地分配 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));