输入punning Vs Union成员访问权限

时间:2013-10-22 07:13:48

标签: c unions type-punning

根据此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

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

感谢。

1 个答案:

答案 0 :(得分:6)

它是在C89中定义的实现:

  

C89 3.3.2.3结构和工会成员

     

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

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

  

C11 6.5.2.3结构和工会成员脚注

     

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