联盟概念中的混乱

dev*_*sda 3 c c++ unions

#include<stdio.h>

union node {
     int i;
     char c[2];
};

main() {

    union node n;
    n.c[0] = 0;
    n.c[1] = 2;
    printf("%d\n", n.i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为它给出了512输出,因为c [0]值存储在第一个字节中,而c [1]值存储在第二个字节中,但给出1965097472.为什么?我在windows中的codeblocks中编译了这个程序.

Cla*_*diu 8

你的联盟分配了四个字节,从以下开始:

[????] [????] [????] [????]
Run Code Online (Sandbox Code Playgroud)

您设置至少两个重要字节:

[????] [????] [0x02] [0x00]
Run Code Online (Sandbox Code Playgroud)

然后,您将所有四个字节打印为整数.你不一定会得到512,因为任何东西都可能是最重要的两个字节.在这种情况下,你有:

[0x75] [0x21] [0x02] [0x00]
Run Code Online (Sandbox Code Playgroud)

  • @LuchianGrigore,在C中这不是UB,但是未初始化的字节的值是未指定的,因此可以是任何东西,如此处所解释的.如果值是该类型的陷阱表示,则仅发生UB.现代体系结构通常没有整数类型的陷阱表示.AFAIR,C++标准有不同的规则,对于C++,它是UB,因此它可以自由地做它喜欢的任何事情.很有可能这种"无论喜欢什么"都是C标准给出的.(通过实现两种不同的策略,编译器实现者无法获得多少) (3认同)
  • 无法保证最低有效字节为{2,0}; 别名行为取决于实现. (2认同)