黑马程序员技术交流社区

标题: 很奇怪的地址问题 [打印本页]

作者: lixiangzhou    时间: 2014-3-21 23:21
标题: 很奇怪的地址问题
本帖最后由 lixiangzhou 于 2014-3-24 15:03 编辑

今天复习的时后看到的,比较下两段程序的输出,这个问题之前有人问过,当时有人回答说不同类型的数据存储的地方不一样,真得是不同类型的数据存储的地方不一样吗???试过下面代码就不明白了,求大神的解释啊
这是之前提过的程序问题,如下
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char c = 'A';
  5.     int a = 10;
  6.    

  7.     printf("a=%p\n", &a);
  8.     printf("c=%p\n", &c);
  9.    
  10.     return 0;
  11. }
复制代码
输出:
a=0x7fff5e706c64
c=0x7fff5e706c6b
这里相差7字节


但是~~~~~~~

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int a = 10;
  5.     char c = 'A';

  6.     printf("a=%p\n", &a);
  7.     printf("c=%p\n", &c);
  8.    
  9.     return 0;
  10. }
复制代码
输出:
a=0x7fff5de52c68
c=0x7fff5de52c67
这里相差1 字节

这不奇怪吗?????????????
路过的大神详细解释下~~~

作者: 周宇华    时间: 2014-3-22 01:23
本帖最后由 周宇华 于 2014-3-22 01:24 编辑

这个要涉及到内存对齐了。简单来说,就是为了放置变量的二次访问。操作系统在访问内存时,每次读取一定的长度(64位系统默认为8字节)。
分析下这两种情况:
no.1、定义的char类型得到内存空间地址是0x7fff5e706c6b,如果不对齐的话,那么分配后面int类型变量的空间就是0x7fff5e706c6a--0x7fff5e706c67这四个字节空间了,那么要读取int型变量就会先读取0x7fff5e706c60--0x7fff5e706c67空间的内容,再读取0x7fff5e706c68--0x7fff5e706c6f空间的内容才能得到int类型变量的值,这就是二次读取了。而使用内存对齐来避免二次读取,将后面的int类型变量空间分配到0x7fff5e706c60--0x7fff5e706c67空间就可以避免,int类型占用4字节空间,即0x7fff5e706c67--0x7fff5e706c64.于是就有了这个结果。
no.2、这个就简单了,int类型变量分配到空间0x7fff5de52c68,系统读取0x7fff5e706c68--0x7fff5e706c6f空间内容,一次性获得int型变量的值;后来的char类型分配的空间0x7fff5de52c67,系统读取0x7fff5e706c60--0x7fff5e706c67空间内容,也是一次性读取获得值。

内存对齐可以用一句话来概括:“数据项只能存储在地址是数据项大小的整数倍的内存位置上”
例如int类型占用4个字节,地址只能在0,4,8等位置上。

以上,乃个人理解,仅供参考。


作者: lixiangzhou    时间: 2014-3-22 08:45
周宇华 发表于 2014-3-22 01:23
这个要涉及到内存对齐了。简单来说,就是为了放置变量的二次访问。操作系统在访问内存时,每次读取一定的长 ...

高见啊,完全能解释这种情况,果然大神啊,谢谢
作者: cnchenys    时间: 2014-3-22 09:59
周宇华 发表于 2014-3-22 01:23
这个要涉及到内存对齐了。简单来说,就是为了放置变量的二次访问。操作系统在访问内存时,每次读取一定的长 ...

高手,终于明白了 我特地按照讲解画了内存图。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2