Каждая ваша структура включает в себя long
, который, по-видимому, требует, чтобы ваша платформа находилась на четырехбайтовой границе. Структура должна быть, по крайней мере, такой же выровненной, как и ее наиболее выровненный элемент, поэтому она должна быть выровнена на 4 байта, а размер структуры должен быть кратным ее выравниванию в случае, если она входит в массив.
Для выравнивания long
требуется дополнительное заполнение, поэтому наименьшее значение, кратное 4, равно 16.
Два совета:
Вы можете вычислить смещение поля l1
на
printf("Offset of field %s is %d\n", "l1", offsetof(struct pad, l1);
Чтобы получить макрос offsetof
, вам понадобится #include <stddef.h>
(спасибо caf!).
Если вы хотите упаковать данные максимально плотно, используйте unsigned char[4]
вместо long
и unsigned char[2]
вместо short
и выполните арифметическое преобразование.
РЕДАКТИРОВАТЬ :: sizeof(struct pad2)
равно 12. Ваш код содержит ошибку; структура P2
объявлена типа struct pad
. Попробуйте это:
#define xx(T) printf("sizeof(" #T ") == %d\n", sizeof(T))
xx(struct pad);
xx(struct pad2);
P.S. Я определенно должен перестать пытаться отвечать на ТАК вопросы после полуночи.