首页 文章

输入punning Vs Union成员访问权限

提问于
浏览
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

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

谢谢 .

1 回答

  • 6

    它是在C89中定义的实现:

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

    在C99 / C11中,它是's allowed, although when it'的陷阱表示,该值是不确定的 .

    C11 6.5.2.3结构和联合成员脚注如果用于读取联合对象内容的成员与上次用于在对象中存储值的成员不同,则该值的对象表示的相应部分为在6.2.6中描述的新类型中重新解释为对象表示(有时称为''punning'') . 这可能是陷阱表示 .

相关问题