Ключевая формулировка здесь:
... общий размер структуры должен быть кратным наибольшему выравниванию любого элемента структуры ...
В вашей системе значение double
равно 4, а не 8.
Если вы ждете C1x, вы можете использовать оператор _Alignof
(аналогично sizeof
).В вашей системе
sizeof(double) == 8
_Alignof(double) == 4
Вы можете проверить выравнивание более примитивным способом в C89,
#include <stdlib.h>
struct char_double { char x; double y; };
#define DOUBLE_ALIGNMENT offsetof(struct char_double, y)
Или с помощью макроса,
#define alignof(x) offsetof(struct { char a; x b; }, b)