如何为结构中嵌入的联合的特定成员可移植地分配空间

时间:2015-01-16 10:06:36

标签: c struct unions c11 offsetof

在C11中考虑以下类型,其中MyType1和MyType2是先前声明的类型:

typedef struct {
  int tag;
  union {
    MyType1 type1;
    MyType2 type2;
  }
} MyStruct;

我希望使用malloc分配足够的内存来保存tag属性和type1。这可以通过便携方式完成吗?我想,由于对齐问题,sizeof(tag) + sizeof(type1)可能无效。

我可以用便携方式从结构的开头计算type1的偏移量吗?

2 个答案:

答案 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的成员。