根据此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的成员。
感谢。
答案 0 :(得分:6)
它是在C89中定义的实现:
C89 3.3.2.3结构和工会成员
有一个例外,如果在将值存储在对象的不同成员中之后访问
union
对象的成员,则该行为是实现定义的。一个特殊的保证是为了简化联合的使用:如果union
包含多个共享共同初始序列的结构,并且union
对象当前包含其中一个结构,则允许检查其中任何一个的共同初始部分。如果相应的成员具有一个或多个初始成员的序列的兼容类型,则两个结构共享共同的初始序列。
在C99 / C11中,它是允许的,虽然当它是陷阱表示时,该值是不确定的。
C11 6.5.2.3结构和工会成员脚注
如果用于读取
union
对象的内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将重新解释为6.2.6中描述的新类型中的对象表示(有时称为''punning''的过程)。这可能是陷阱表示。