Как переносить выделение пространства для конкретного члена объединения, встроенного в структуру

Рассмотрим следующий тип в C11, где MyType1 и MyType2 являются ранее объявленными типами:

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

Я хотел бы выделить достаточно памяти, используя malloc держать tag атрибут и type1, Можно ли это сделать портативным способом? Похоже, sizeof(tag) + sizeof(type1) может не работать из-за проблем с выравниванием.

Могу ли я вычислить смещение типа 1 от начала структуры переносимым способом?

2 ответа

Решение

Ты можешь использовать offsetof() и так как это будет включать в себя как размер tag и любой отступ, достаточно затем добавить размер type1:

void *mys = malloc(offsetof(MyStruct, type1) + sizeof (MyType1));

Могу ли я вычислить смещение типа 1 от начала структуры переносимым способом?

Вы можете, вероятно, использовать offsetof от stddef.h за это.

printf("Offset of type1 in the struct: %zu\n", offsetof(MyStruct, type1));

Примечание: это работает, потому что вы используете "анонимный союз". Если бы вы сказали union { ... } u;type1 не был бы членом MyStruct,

Другие вопросы по тегам