Глава 6.7.8.10 стандарта ISO / IEC C9899: 1999 описывает, как инициализируются объединения со статической продолжительностью хранения:
Если объект с автоматическим хранением не был инициализирован
явно его значение не определено. Если объект, который имеет статический
продолжительность хранения не инициализируется явно, тогда:
- если он имеет тип указателя, он инициализируется нулевым указателем;
- если он имеет арифметический тип, он инициализируется нулевым (положительным или без знака);
- если это агрегат, каждый элемент инициализируется (рекурсивно) в соответствии с этими правилами;
- если это объединение, первый именованный элемент инициализируется (рекурсивно) в соответствии с этими правилами.
давайте предположим, что у нас есть следующий код, где фактически второй член объединения занимает больший объем памяти, чем первый член объединения:
typedef struct
{
uint32_t a;
uint32_t b;
uint32_t c;
uint32_t d;
} my_structure_t;
typedef union
{
uint8_t *first_member;
my_structure_t later_member;
} my_union_t;
static my_union_t data;
Где-то в стандарте C определено, как будет инициализироваться область памяти, занятая later_member
? Поскольку нижеприведенные утверждения, я подозреваю, что это поведение, определяемое реализацией, однако мне нужно подтверждение и, по крайней мере, ссылки на некоторую документацию gcc, clang, ghs, где это описано.
http://www.open -std.org / ОТК1 / SC22 / WG14 / WWW / Docs / n1311.pdf
Затем следует DR_016, с которого (в вопросе 2) начинается с:
актуально только для оборудования, на котором либо нулевой указатель, либо плавающий
нулевая точка представлена / не / представлена как все нулевые биты.
Имеет дело с
union { char *p; int i; } x;
и затем заявляет:
Если нулевой указатель
представлен как, скажем, 0x80000000, то не существует способа неявно
инициализировать этот объект. Либо член p содержит ноль
указатель или член i содержит 0, но не оба. Итак, поведение
этой единицы перевода не определено. Это плохое состояние
Дела. Я полагаю, что Комитет не намеревался запрещать
большой класс неявно инициализированных объединений; это сделало бы
большая часть существующего кода не соответствует.
Вопрос в основном нацелен на стандарт C99, однако сравнения с другими стандартами C более чем приветствуются.