CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

静态数据区数据分配的问题

楼主wtzyb4446(不死鸟)2004-09-03 10:45:35 在 C/C++ / C语言 提问

有如下程序,在VC6.0下编译运行:  
  int   n   =   0;  
  int   *pn   =   &n;  
  int   main(int   argc,   char*   argv[])  
  {  
  printf("\n   &n   =   %d",   &n);  
  printf("\n   &pn   =   %d",   &pn);  
  getch();  
  return   0;  
  }  
  运行结果如下:  
    &n   =   4340464  
    &pn   =   4336448  
    问   1:为什么n与pn地址相差如此远,不都是在静态存储区分配的吗?  
   
  如果将程序作如下修改:  
  int   n   =   0;  
  int   *pn;  
  int   main(int   argc,   char*   argv[])  
  {  
  pn   =   &n;  
  printf("\n   &n   =   %d",   &n);  
  printf("\n   &pn   =   %d",   &pn);  
  getch();  
  return   0;  
  }  
  就得到了如下结果:  
    &n   =   4340444  
    &pn   =   4340440  
  问   2:   现在n与pn的地址是相邻的,但为什么n的地址会在pn的地址后面?  
   
  又有如下程序:  
  int   n;  
  int   n1;  
  int   main(int   argc,   char*   argv[])  
  {  
  printf("\n   &n   =   %d",   &n);  
  printf("\n   &n1   =   %d",   &n1);  
  getch();  
  return   0;  
  }  
  输出结果:  
    &n   =   4340164  
    &n1   =   4340160  
  而如果将前两行修改为:  
  int   n   =   0;  
  int   n1=   1;  
  则输出结果为:  
    &n   =   4340160  
    &n1   =   4340164  
  问   3:   为什么初始化与不初始化会导致地址顺序相反?  
   
  望dx解惑,感激不尽! 问题点数:100、回复次数:32Top

1 楼wtzyb4446(不死鸟)回复于 2004-09-03 10:45:49 得分 0

自己顶先Top

2 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 10:57:10 得分 0

帮顶~Top

3 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 10:58:59 得分 0

楼主把第一个程序改为  
  int   n   =   0;  
  int   *pn   =   &n;  
  int   main(int   argc,   char*   argv[])  
  {  
  printf("\n   &n   =   %d",   &n);  
  printf("\n   &pn   =   %d",   pn);  
  getch();  
  return   0;  
  }  
  看看,呵呵Top

4 楼liushuaiboy(标准菜鸟)回复于 2004-09-03 11:00:39 得分 0

不好意思,看错了,汗!Top

5 楼wtzyb4446(不死鸟)回复于 2004-09-03 11:01:41 得分 0

to   liushuaiboy(标准菜鸟)   :  
        我是关心pn本身的地址,而不是它的值,它的值其实就是n的地址,你这样修改之后,两行输出的值是一样的。Top

6 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 12:06:00 得分 40

int   n   =   0;  
  int   *pn   =   &n;  
  ------------------------------------------------  
  因为   n   =   0   ,     n   就被放到   _BSS   段了,   而   pn   被放到了   _DATA   段,当然地址相差就很远了  
   
  改成  
  int   n   =   1;   int   *pn   =   &n;   则两者都放在   _DATA   段,应该地址就是相临的了  
   
  Top

7 楼wtzyb4446(不死鸟)回复于 2004-09-03 12:32:17 得分 0

to:   DiabloWalkOnTheEarth(毁灭小符   (Annihilus)(99)(3502)):  
          果如所言,多谢!Top

8 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 12:32:41 得分 0

同样,中间两种情况下,两个变量都在   _BSS   段,因此地址相邻,不过为什么是倒序就不清楚了  
   
  int   n   =   0;  
  int   n1=   1;  
  ----------------------------------------  
  n   在   _BSS   段,   n1   在   _DATA   段,两个变量应该不会相邻的,如果真的相邻了,大概是撞大运撞上了吧Top

9 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:04:03 得分 0

int   n   =   0;  
  int   *pn   =   &n;  
  int   main(int   argc,   char*   argv[])  
  {  
  printf("\n   &n   =   %d",   &n);  
  printf("\n   &pn   =   %d",   &pn);  
  getch();  
  return   0;  
  }  
  ---  
   
  Top

10 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:04:17 得分 10

因为   n   =   0   ,     n   就被放到   _BSS   段了,   而   pn   被放到了   _DATA   段,当然地址相差就很远了  
   
  改成  
  int   n   =   1;   int   *pn   =   &n;   则两者都放在   _DATA   段,应该地址就是相临的了  
   
  Top

11 楼bm1408(向va_list学习~不用VC好多年~)回复于 2004-09-03 13:05:21 得分 0

_bbs  
   
  -data    
  Top

12 楼huangyang88(中国-必胜)回复于 2004-09-03 14:32:57 得分 0

楼上的都说了,我来接分Top

13 楼wtzyb4446(不死鸟)回复于 2004-09-03 14:42:17 得分 0

to   DiabloWalkOnTheEarth(毁灭小符   (Annihilus)(99)(3502))   :  
  不是   int   n   =   0;  
            int   n1   =   1;  
  是我敲错了,都等于0;  
   
  不过都不赋初值的话,地址顺序确实是相反的,我再次证实了一下。Top

14 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 14:59:16 得分 0

呵呵,好像是这样的  
   
  不过奇怪的是我看了一下  
  int   n   =   0;  
  int   n1   =   0;    
  和    
  int   n;  
  int   n1;  
   
  生成的list   文件是一样的,不知道怎么会运行起来不同,咔咔,   看来这些还是不要关心的好Top

15 楼sunlu_eric(天使预备役)回复于 2004-09-03 15:08:01 得分 0

学习中!!!!  
  谢谢!Top

16 楼xteaj(半桶水)回复于 2004-09-03 15:27:43 得分 0

这些都与编译器的优化有关,关掉所有的优化选项试试看。Top

17 楼steveyzhang(keepthefaith)回复于 2004-09-03 15:58:53 得分 0

_BSS   段   ?   _DATA   段   ?小弟不解,谁能说得更详细些,谢谢了Top

18 楼DiabloWalkOnTheEarth(我想到个绝妙的昵称,只是地方太小,写不下)回复于 2004-09-03 17:52:18 得分 0

_BSS         未初始化数据区.  
  _DATA       初始化数据区.Top

19 楼Zark(金陵五月)回复于 2004-09-04 02:34:22 得分 0

我来解释一下"为什么其地址是倒序的".  
   
  学过计算机原理的人都应该知道,在内存中有两种结构,一是堆,二是栈,其使用内存的方法是"栈往上涨,堆往下生".全局及静态变量区是堆结构,所以先定义的变量其地址大.  
  |           |       0x40000  
  |           |  
  |           |       0x20000  
  |           |  
  |_____|       0x1  
  (内存映像)  
  Top

20 楼somedummy(某人马甲)回复于 2004-09-04 03:32:25 得分 0

楼上肯定没仔细看楼猪说的话,楼猪问的是为什么不初始化和初始化两个顺序不一样……  
   
  另外,楼上为什么总是深夜出现?装鬼吓人?Top

21 楼somedummy(某人马甲)回复于 2004-09-04 03:35:09 得分 0

另外,堆栈好象说反了……Top

22 楼wtzyb4446(不死鸟)回复于 2004-09-05 10:51:31 得分 0

不知道有没有人能解释为什么不初始化和初始化两个顺序不一样?  
  如果没有的话,只好结贴了!Top

23 楼wtzyb4446(不死鸟)回复于 2004-09-05 10:54:40 得分 0

to   somedummy(某人马甲):    
        拜托不要敲错别字好不好,虽然我好吃懒做,还有点胖,不过毕竟是个人,不是...Top

24 楼xteaj(半桶水)回复于 2004-09-05 11:02:31 得分 20

运行的结果都只能是编译器分配空间的一种情形。  
  编译器针对不同的情形有不同的分配算法,  
  我们在不知道分配算法(编译器制造者才知道)的情形下是讨论不清的,  
  何况还有优化问题,我们就更想不清楚了。  
  我在DEV-C++中运行的结果地址的顺序没变,但位置相差比较远。Top

25 楼hewittlee(只爱C++)回复于 2004-09-05 11:14:00 得分 0

内存堆栈问题!Top

26 楼xqlez(&引用)回复于 2004-09-05 11:17:14 得分 0

不初始化的放在.bss中,  
  初始化的放在.data中,  
  Top

27 楼xqlez(&引用)回复于 2004-09-05 11:21:24 得分 10

DEV-C++  
  把初始化为0当做不初始化,  
  所以位置相差比较远Top

28 楼wwwooowww(熔点)回复于 2004-09-05 11:43:57 得分 10

:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符串;.bss(未初始化数据段)包含未初始化的变量、数组等。Top

29 楼wangyangcheng(矛盾)回复于 2004-09-05 13:10:03 得分 0

mark.Top

30 楼darkwanderer(一个人到处走)回复于 2004-09-06 15:53:59 得分 10

http://community.csdn.net/Expert/topic/3215/3215569.xml?temp=.3182337  
   
                low   address  
        +--------------------------------+  
        |       _TEXT   class   'CODP'                       |  
        |                 code                                         |  
        +--------------------------------+--  
        |       _DATA   class   'DATA'                       |    
        |           initialized   data                       |    
        +--------------------------------+   DGROUP  
        |       _BSS   class   'BSS'                           |    
        |           uninitialized   data                   |    
        +--------------------------------+--  
        |                                                                 |  
        |           FREE   SPACE                                   |  
        +--------------------------------+  
        |                                                                 |  
        |           STACK                                             |  
        +--------------------------------+  
        |                                                                 |  
        |           HEAP                                               |  
        +--------------------------------+  
        |                                                                 |  
        |           FREE   SPACE                                   |  
        +--------------------------------+  
                    high   address  
  Top

31 楼junmayang(笨猪)回复于 2004-09-06 16:22:30 得分 0

牛!Top

32 楼wtzyb4446(不死鸟)回复于 2004-09-07 20:40:06 得分 0

结贴!Top

相关问题

  • 关于常量数据区和全局(静态)数据区
  • DLL共享数据区是否可以动态分配数据大小!
  • 函数返回的是 指向 静态数据区 的指针,为什么 这样可以修改!???
  • C++中静态成员函数存放在全局数据区还是代码区?
  • VARIANT 的(VT_ARRAY | VT_UI1)数据区在哪?
  • 代码区,数据区,堆,栈?
  • 多线程共享数据区的问题
  • 如何获取TBitmap的图象数据区地址?
  • 怎么找到EXE文件的数据区,并修改之?(VC)
  • 请问如何获得HBITMAP位图数据区的指针?

关键词

  • c++
  • 编译器
  • 数据
  • 优化
  • 内存
  • 修改
  • pn
  • 初始化
  • 数据区
  • 地址

得分解答快速导航

  • 帖主:wtzyb4446
  • DiabloWalkOnTheEarth
  • bm1408
  • xteaj
  • xqlez
  • wwwooowww
  • darkwanderer

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo