据此https://stackoverflow.com/a/1812932/1814023writing one member of union and reading another member is undefined behavior.
根据这个https://stackoverflow.com/a/11640603/1814023type punning is allowed in C99 / C11
我对这两个帖子有点困惑,哪一个是正确的?
在理解类型双关语和访问工会成员方面需要帮助。
谢谢。

最佳答案

C89中定义的实现:
C89 3.3.2.3结构和工会成员
有一个例外,如果在对象的不同成员中存储值之后访问union对象的成员,则行为是由实现定义的。为了简化联合的使用,有一个特别的保证:如果aunion包含几个共享一个公共初始序列的结构,并且如果union对象当前包含这些结构之一,则允许检查其中任何结构的公共初始部分。如果对应的成员具有一个或多个初始成员序列的兼容类型,则两个结构共享一个公共的初始序列。
在c99/c11中,它是允许的,尽管当它是陷阱表示时,值是不确定的。
C11 6.5.2.3结构和工会成员脚注
如果用于读取union对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的适当部分将重新解释为6.2.6中描述的新类型中的对象表示(有时称为“类型双关”的过程)。这可能是一个陷阱表示。

10-07 19:23
查看更多