Подтвердить что ты не робот

Выравнивание юниверсов

Если у меня есть союз, стандарт 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])
4b9b3361

Ответ 1

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

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

Удаленный текст применяется к следующим сравнениям:

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

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


Мне было предложено процитировать стандарт - или определить раздел стандарта.

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

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