输入punning Vs Union成员访问权限

Sta*_*kIT 3 c unions type-punning

按照这个/sf/answers/126905271/ writing one member of union and reading another member is undefined behavior.

并根据此/sf/answers/814842241/ type punning is allowed in C99 / C11

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

谢谢.

Yu *_*Hao 6

它是在C89中定义的实现:

C89 3.3.2.3结构和工会成员

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

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

C11 6.5.2.3结构和工会成员脚注

如果用于读取union对象内容的成员与上次用于在对象中存储值的成员不同,则将值的对象表示的适当部分重新解释为新类型中的对象表示,如所描述的在6.2.6(一个有时被称为''type punning''的过程).这可能是陷阱表示.