类型双关语与联盟成员访问

2024-02-15

按照这个https://stackoverflow.com/a/1812932/1814023 https://stackoverflow.com/a/1812932/1814023 writing one member of union and reading another member is undefined behavior.

根据这个https://stackoverflow.com/a/11640603/1814023 https://stackoverflow.com/a/11640603/1814023 type punning is allowed in C99 / C11

我对这两篇文章有点困惑,哪一篇是正确的? 需要帮助来理解类型双关与访问联合成员。

Thanks.


它是在 C89 中定义的实现:

C89 3.3.2.3 结构和联合成员

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

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

C11 6.5.2.3 结构和联合成员footnote

如果会员曾经阅读过的内容union对象与对象中最后用于存储值的成员不同,该值的对象表示形式的适当部分将被重新解释为新类型中的对象表示形式,如 6.2.6 中所述(该过程有时称为“ '类型双关语'')。这可能是一个陷阱表示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型双关语与联盟成员访问 的相关文章

随机推荐