Как переносить выделение пространства для конкретного члена объединения, встроенного в структуру
Рассмотрим следующий тип в 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
,