Выравнивание элемента объединения

Если у меня будет объединение, то 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])
20
задан timrau 14 August 2012 в 23:49
поделиться

1 ответ

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

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

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

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

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


Меня попросили процитируйте стандарт - или укажите раздел стандарта.

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

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

27
ответ дан 30 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: