3

按照这个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

我对这两个帖子有点困惑,哪一个是正确的?在理解类型双关语与访问工会成员方面需要帮助。

谢谢。

4

1 回答 1

6

它在 C89 中实现定义:

C89 3.3.2.3 结构和工会成员

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

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

C11 6.5.2.3 结构和工会成员脚注

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

于 2013-10-22T07:40:27.560 回答