输入punning Vs Union成员访问权限

根据这个https://stackoverflow.com/a/1812932/1814023 writing one member of union and reading another member is undefined behavior.

并且根据这个https://stackoverflow.com/a/11640603/1814023 type punning is allowed in C99 / C11

我对这两个post感到有点困惑,哪一个是正确的? 需要帮助理解类型惩罚Vs访问union的成员。

谢谢。

它是在C89中定义的实现:

C89 3.3.2.3结构和工会成员

除了一个例外, 如果在将值存储在对象的不同成员中之后访问union对象的成员,则该行为是实现定义的。 为了简化联合的使用,我们做了一个特殊的保证:如果一个union包含几个共享一个共同初始序列的结构,并且如果union对象当前包含这些结构中的一个,则允许检查任何共同的初始部分。他们 如果相应的成员具有一个或多个初始成员的序列的兼容类型,则两个结构共享共同的初始序列。

在C99 / C11中,它是允许的,尽管当它是陷阱表示时 ,该值是不确定的。

C11 6.5.2.3结构和工会成员脚注

如果用于读取union对象内容的成员与上次用于在对象中存储值的成员不同,则将值的对象表示的相应部分重新解释为新类型中的对象表示forms6.2.6中描述的过程(有时称为”punning”)。 这可能是陷阱表示。