黑马程序员技术交流社区
标题:
问个挺无聊又奇怪的问题
[打印本页]
作者:
钟楼上的猫
时间:
2015-1-11 16:01
标题:
问个挺无聊又奇怪的问题
int a = 1;
char b = 'B';
printf("%x\n", &a);
printf("%x\n", &b);
打印出的结果 a的地址值比b的地址值大1 因为char只占1个字节
char b = 'B';
int a = 1;
printf("%x\n", &b);
printf("%x\n", &a);
打印出的结果 b的地址值比a的地址值大7 这是怎么回事
作者:
仰望的繁华
时间:
2015-1-11 23:46
本帖最后由 仰望的繁华 于 2015-1-12 00:00 编辑
入门水平低,想了个笨方法试了试,
貌似试出了点规律:
1. char 和 char 互换后正常
2. 其他类型互换后也正常
3. char 和 其他类型互换 如楼主所述
4. 定义1~4个char 和 int :char从ff2f递减至ff2c int一直是 ff28,即占用8,9,a,b
5. 定义5~8个char 和 int :char从ff2f递减至ff28 int一直是 ff24,即占用4,5,6,7
6. 定义9~12个char和 int :估计int 会再退4,留出4个位置给继续增加的char。
验证:确实如此,int一直ff20
照此规律猜想了一下:
最初的地址相差7,就像是当char定义后,再定义int时,
int为前面的char留了和自己一样4个字节的空间,然后自己也占4个字节。
在根据倒序分配内存,char占了int给他留出的4个字节的最大一个,上面留出了3个。
而int占了更加上面四个字节,然后首字节位置为地址。
这样出现了 3+4的地址差。
并且,如果多个char在int前,当int前预留空间不足,则以4字节为单位后退,分配更小的地址。
特例情况:四个char和int地址可以连续。再用这个猜想去继续猜想最初,一个char和int的情况:
假设有指针指向最后一次分配的地址,那么int原计划分配4字节,去找到该指针指示的地址,计划倒序分配4字节,此时int的4字节最下面一个与char对应,
发现冲突,指针按照int的占用,后退4个寻找起点,倒序分配新的4字节,此时int地址为倒序分配的最后一个字节对应的最小地址。这样就出现了相差7....
好吧一切都是对表面现象的猜测~
依然要等大神们来解释正确的原因~
如果你被我绕晕了,就奖励几个HMB吧,看在我把自己都绕晕了的份上.....
作者:
mengxingdong
时间:
2015-1-12 15:00
简单说,内存分配存储空间是从大到小的。而变量是从内存地址从小到大取值的。所以就造成了上面的现象。看在说的最简单,赏点HMB吧~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2