以下代码的输出为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;
}
答案 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