编译运行会发生什么?
哈哈,当然是给出warning后Segmentation fault。
。。。。。。用指针解决一下
我们都知道:数据在内存中是01存储的,它是什么类型的数据,就看我们怎么看待它。
(4407873)10进制 -> (434241)16进制
我们知道:16 进制的41、42、43对应10进制assci码中大写字母A 42->B,43->C
但是,为什么输出是ABC而不是CBA?
这就涉及到计算机中大小端问题了。下面这个是百度百科的解释:
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
下面是一个前辈关于大小端的文章:
https://blog.csdn.net/u011327334/article/details/46555047
由此我们可知:我们的int a在内存中是 41 42 43 这样存的。
画个图:
所以我们输出的是:ABC(灵魂画师……哈哈哈)
--------------------------------这是分界线--------------------------------
下面我们想办法改一下
如何让其输出:A3C ?(就是把B改成3)
哈哈哈,其实方法很多。
1.计算出A3C的值,在调试的时候改内存中的值。
2.用union
struct MyColor
{
int color;
char c[4];
};
int main()
{
union MyColor mycolor;
mycolor.color = 4407873;
printf("%s\n",mycolor.c); | 输出ABC |
mycolor.c[1] = '3';
printf("%s\n",mycolor.c); | 输出A5C |
}
这样输出的就是 A3C。
等等等等,还有很多。
还请前辈学长学姐同学们批评指正!