A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 钟楼上的猫 高级黑马   /  2015-1-11 16:01  /  1000 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

    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   这是怎么回事

2 个回复

倒序浏览
本帖最后由 仰望的繁华 于 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吧,看在我把自己都绕晕了的份上.....




评分

参与人数 1黑马币 +10 收起 理由
钟楼上的猫 + 10 果然晕了~~辛苦了

查看全部评分

回复 使用道具 举报
简单说,内存分配存储空间是从大到小的。而变量是从内存地址从小到大取值的。所以就造成了上面的现象。看在说的最简单,赏点HMB吧~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马