为什么这个c程序的输出是这样的?

时间:2018-04-26 13:11:05

标签: c

以下代码的输出为512 0 2,但应该是512 0 0.有人可以帮忙!

 #include<stdio.h>
    int main()
    {
        union a
        {
            int i;
            char ch[2];
        };
        union a z = { 512 };
        printf("%d %d %d\n",z.i, z.ch[0], z.ch[1]);
        return 0;
    }

3 个答案:

答案 0 :(得分:5)

您已经构建了两个字节的并集。知道你为联盟分配512d(0x0200)。 第一个字节= 0x00 第二个字节= 0x02

整数i和你的数组ch [2]使用相同的内存!

答案 1 :(得分:3)

为简单起见,我们假设int是2个字节。在这种情况下,结构的内存将是2个字节。我们还假设联合位于地址0x0000.By结果你得到我可以告诉你使用一个小端机 - 地址0x0000 - &gt;值0x0000,地址0x0002 - &gt;值0x0002。

z.i正确打印512。

z.ch[0]从地址0x0000获取值0

z.ch[1]从地址0x0002获取值2

  

Big Endian字节顺序:最重要的字节(&#34;大端&#34;)   数据放在具有最低地址的字节处。其余的   数据按顺序放在内存中的下三个字节中。

     

Little Endian字节顺序:最低有效字节(&#34;小字节   数据的结束&#34;)放在具有最低地址的字节处。该   其余数据按顺序放在内存中的下三个字节中。

答案 2 :(得分:2)

我认为你对结构和联盟感到困惑。

union对其所有成员使用相同的内存,并且struct为每个成员都有一个单独的内存。

请参阅以下代码扩展名(位于IDEone):

#include<stdio.h>
int main()
{
    union a
    {
        int i;
        char ch[2];
    };
    union a aa = { 512 };
    printf("%d %d %d\n",aa.i, aa.ch[0], aa.ch[1]);

    struct b
    {
        int i;
        char ch[2];
    };
    struct b bb = { 512 };
    printf("%d %d %d\n",bb.i, bb.ch[0], bb.ch[1]);
    return 0;
}

输出:

Union: 512 0 2
Struct: 512 0 0