结果是A
#include <stdio.h>
int main()
{
union { int a; char b[2];} c;
c.a=65;
puts(c.b); printf("%d\n",sizef(c));
return 0;
}
结果是A
#include <stdio.h>
int main()
{
union { int a; char b[2];} c;
c.a=65;
puts(c.b); printf("%d\n",sizef(c));
return 0;
}
sizeof计算一个变量在内存中占用的字节数,C语言中int占用4字节,char占用一个字节。
Union是联合体,表示a和b共用一段内存空间,当通过联合体调用a时,将字节解释为int,否则解释为char数组。
65<2^8,所以65只占用了int空间的一个字节,剩下3个字节为空
一般来说机器都是小端法储存数字,即低位字节存在前面(低地址),高位字节存在后面(高地址)所以c的内存空间如下
|地址|&c|&c+1|&c+2|&c+3|
|数据|65|0|0|0|
而union声明会让数组b的第一个元素是&c处的元素,第二个元素是&c+1处的元素。所以puts(c.b)相当于在打印数组['\65','\0'],而A的ASCII码是65,所以会打印出A