2009-05-21 3 views
19

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

напоминание, чтобы иметь в виду, что стандарт не сказать 'u.i & 0xFF == ЯК [0]' или низкого порядка байт I не гарантируется с [0] (байтов) – Spudd86

ответ

23

Начало каждого элемента согласовано с адресом самого союза.

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

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

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

Пересмотренный вариант сравнивает различные типы указателей - указатели должны быть поданы в недействительных указателей.


меня попросили процитировать стандарт - или идентифицировать раздел стандарта.

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

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

+3

Может вы ссылаетесь на соответствующую часть стандарта, пожалуйста? –

Смежные вопросы