Я использую библиотеку, в которой есть функция, которая принимает массив структур. Эта структура и функция имеют следующую компоновку:
struct TwoInt32s
{
int32_t a;
int32_t b;
};
void write(struct TwoInt32s *buffer, int len);
Мои первоначальные тесты показывают, что массив таких структур имеет ту же структуру памяти, что и массив int32_t
, поэтому я могу сделать что-то вроде этого:
int32_t *buffer = malloc(2 * len * sizeof(int32_t));
/* fill in the buffer */
write((struct TwoInt32s*)buffer, len);
Однако мне интересно, правда ли это универсально или нет. Использование массива int32_t
значительно упрощает мой код.
РЕДАКТИРОВАТЬ: я забыл размер
Из того, что я прочитал, C гарантирует несколько вещей о заполнении структуры:
- Члены НЕ будут переупорядочены
- Заполнение будет добавлено только между элементами с различными выравниваниями или в конце структуры
- указатель на структуру указывает на ту же ячейку памяти, что и указатель на ее первый член
- каждый элемент выровнен в соответствии с его типом
- в структуре могут быть безымянные дыры, необходимые для выравнивания
Из этого я могу экстраполировать, что a
и b
не имеют отступов между ними. Однако возможно, что структура будет иметь отступ в конце. Я сомневаюсь в этом, поскольку он выровнен по словам в 32- и 64-разрядных системах. У кого-нибудь есть дополнительная информация по этому поводу?