Ответ на этот вопрос зависит от исторического контекста, поскольку спецификация языка менялась со временем. И это дело, как раз то, что затронуто изменениями.
Вы сказали, что читаете K & R. Последнее издание этой книги (на данный момент) описывает первую стандартизированную версию языка Си - C89 / 90. В этой версии языка C написание одного члена союза и чтение другого члена неопределенное поведение . Не реализация определена (что другое), а undefined поведение. Соответствующая часть языкового стандарта в этом случае составляет 6,5 / 7.
Теперь, на более позднем этапе эволюции C (версия спецификации языка C99 с применением Технического исправления 3) внезапно стало законным использовать union для обозначения типов, то есть написать один член объединения, а затем прочитать другой.
Обратите внимание, что попытка сделать это может привести к неопределенному поведению. Если прочитанное вами значение оказывается недопустимым (так называемое «представление ловушки») для типа, через который вы его читаете, поведение по-прежнему не определено. В противном случае прочитанное вами значение определяется реализацией.
Ваш специфический пример относительно безопасен для типов с массой от int
до char[2]
массива. На языке Си всегда допустимо переосмысливать содержимое любого объекта как массив символов (опять же, 6.5 / 7).
Однако обратное неверно. Запись данных в элемент массива char[2]
вашего объединения, а затем чтение его как int
может потенциально создать представление ловушки и привести к неопределенному поведению . Потенциальная опасность существует, даже если ваш массив символов имеет достаточную длину, чтобы покрыть все int
.
Но в вашем конкретном случае, если int
окажется больше char[2]
, прочитанное int
охватит неинициализированную область за концом массива, что снова приведет к неопределенному поведению.