首先看一段程序,猜测输出结果:
#include <stdio.h>
union A
{
int i;
char c[2];
};
int main()
{
A a;
a.c[0] = 10;
a.c[1] = 1;
printf("%d", a.i);
return 0;
}
结果是 -859045622
而下面这段程序:
#include <stdio.h>
union A
{
int i;
char c[2];
};
int main()
{
static A a;
a.c[0] = 10;
a.c[1] = 1;
printf("%d", a.i);
return 0;
}
结果是266
为啥呢?
首先我们看这里有个Union联合体,我们知道联合体内的数据类型是共享内存的。
也就是说这个A 其实就占用四个字节,上面两个程序的唯一区别就在于A的声明,一个是自动的,一个是static的,两者的区别是static的变量存在于静态存储区,是初始化的,而一个是在栈里,没有初始化。
第一个程序中,没有初始化,是随机值,难怪会输出这么奇怪的数字。。。
第二个程序,联合体的内存分布式这样的。
static变量初始化为0
c[0] c[1] 依次放入地地址,形如:
第一个字节 第二个字节 第三个字节 第四个字节
0000,0000 0000,0000 0000,0001 0000,0010
c[1] c[0]
这样就成了256 + 10 = 266
测试一下我的CPU是不是小段模式
#include <stdio.h>
bool IsBigEndian()
{
int a = 0x1234;
char b = *(char *)&a; //通过将int强制类型转换成char单字节,通过判断起始存储位置。即等于 取b等于a的低地址部分
if( b == 0x12)
{
return true;
}
return false;
}
int main()
{
if(IsBigEndian())
{
printf("Big\n");
}
else
{
printf("Small");
}
return 0;
}