Выравнивание элементов объединения - PullRequest
20 голосов
/ 21 мая 2009

Если у меня есть объединение, стандарт C гарантирует, что само объединение будет выровнено по размеру самого большого элемента.

union U {
    long l;
    int i;
    short s;
    char c[2];
} u;

Но что это говорит о выравнивании отдельных элементов объединения внутри объединения? Гарантируется ли следующее выражение истинным?

(&u.l == &u.i) && (&u.i == &u.s) && (&u.s == &u.c[0])

1 Ответ

26 голосов
/ 21 мая 2009

Начало каждого элемента совпадает с адресом самого объединения.

поэтому отдельные сравнения в выражении, о котором вы спрашиваете, являются истинными, но выражение в целом ложно, если объединение не находится по адресу 0x0001. Удаленный текст применяется к следующим сравнениям :

&u.l == &u.i == &u.s == &u.c[0]

В пересмотренной версии сравниваются различные типы указателей - указатели следует приводить к пустым указателям.


Меня попросили процитировать стандарт или указать раздел стандарта.

C99 - раздел 6.7.2.1 Спецификация структуры и объединения (параграф 14):

Указатель на объект объединения, соответствующим образом преобразованный, указывает на каждого из его элементов (или, если элемент является битовым полем, затем на модуль, в котором он находится), и наоборот.

...