【问题标题】:Type punning Vs Union member access类型双关语与联盟成员访问
【发布时间】:2013-10-22 07:13:47
【问题描述】:

据此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

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

谢谢。

【问题讨论】:

    标签: c unions type-punning


    【解决方案1】:

    它在 C89 中实现定义:

    C89 3.3.2.3 结构和联合成员

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

    在 C99/C11 中是允许的,但是当它是 trap 表示时,它的值是不确定的。

    C11 6.5.2.3 结构和工会成员脚注

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

    【讨论】:

    • int swap_words(int arg){short int* const sp = (short int*)&arg;短 int hi = sp[0];短 int lo = sp[1]; sp[1] = 你好; sp[0] = 低;返回(arg); }
    • 上面的代码是在做类型双关,结果是在 C89 中实现定义的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多