内存组织的困惑

pwcrab 2007-11-15 11:45:01
一般书上都说,内存布局一般是这样的

------------ ->地址高位
| 栈(stack)|
------------
| 堆(stack)|
------------
| BSS |
------------
| DATA |
------------
| TEXT |
------------ —>地址低位
现在有一些疑惑
#include <stdio.h>
int glob;

void main(){
int local;
printf("0x%08x\n",&glob); //打印本地变量的内存地址
printf("0x%08x\n",&local); //打印全局变量的内存地址
}

在我机器上执行的结果是
0x00411d68
0x0012ff7c

我的问题是,glob不是全局变量应该放在bss段中,而
local是局部变量应该放在栈中吗。
那为什么glob的内存地址会比local的内存地址高??
...全文
344 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
fromiss 2008-04-28
  • 打赏
  • 举报
回复
堆栈指的应该是堆,heap……
栈在高端内存地址。
cat /proc/procNo./maps就能看到了
星羽 2008-04-21
  • 打赏
  • 举报
回复
星羽 2008-04-21
  • 打赏
  • 举报
回复

├———————┤低端内存区域
│ …… │
├———————┤
│ 动态数据区 │ // 这里就是堆栈
├———————┤
│ …… │
├———————┤
│ 代码 │
├———————┤
│ 静态数据区 │ // 静态数据,全局数据大概就在这里
├———————┤
│ …… │
├———————┤高端内存区域



所以全部变量地址比堆栈的变量地址高
rularys 2008-04-21
  • 打赏
  • 举报
回复
系统平台只给用户保证堆、栈的语义的正确,比如说,保证堆可以动态生长或者说可以自由地在里面申请
内存,而栈则会保证有先进后出的特性,并且两者不会有冲突,至于它们各自安放在哪里,怎么实现,那是
系统的自由,对用户来说是透明的;对于全局变量,静态变量,局部变量的处理,编译器也是仅仅保证他们
有正确的行为与属性,至于怎么实现对他们的管理,那是编译器的自由,对用户来说也是透明的。除非有特别
要求,否则用户对他们的实现的疑惑都是多余的,在设计上对他们的实现有所依赖更是不明智的。

比如,有时候某个全局变量甚至有可能是被分布存储在网络的某台机器上,但是这些客户可以不关心,只要这个变量
在我们的程序里表现得和其他的全局变量没有任何区别。

所以楼主得到结果其实一点也不奇怪,也不用为之困惑
hong8292 2008-01-29
  • 打赏
  • 举报
回复
x86上,栈内存从高地址到地址分配。
shining 2008-01-21
  • 打赏
  • 举报
回复
首先问问楼主运行的系统是什么。

一般而言,大部分Unix系统的内存结构都是这样安排的。我在solaris上试过了,结果跟内存布局的地址分配方法一致。
linlan999 2007-12-30
  • 打赏
  • 举报
回复
感觉6楼的回答有问题!
支持8楼的!!局部变量在栈中分配,全局变量在静态存储区。
yfw418 2007-11-21
  • 打赏
  • 举报
回复
局部变量分配地址空间在上,全局变量分配地址空间在静态存储区
pwcrab 2007-11-21
  • 打赏
  • 举报
回复

引用:suyouxin
“如果是windows这些系统,printf得到的都是虚拟地址,那么这些段地址都是在进程初始化时操作系统指定的,由内存管理模块映射出来的虚拟地址,比如code放哪,BSS放哪,data放哪 ”

这个解释解开了我的一些疑问,非常感谢。这应该就是PE文件的不同节由操作系统进行的映像吧,这样理解是否正确?


引用:zhulinpptor
“你定义的两个变量,编译器并不管它们是全局还是局部都是从栈中分配的内”

这个观点,我有疑问,栈是一种用于动态内存分配和管理的对象,在虚拟地址空间中
栈是连续的,且其生长方向是由顶向下,这两个变量如果都是在栈上那为什么
他们的虚拟地址会差这么远?0x00411d68 0x0012ff7c ??

操作系统书也看了,但是,感觉还是有些概念很混沌...继续学习
pptor 2007-11-20
  • 打赏
  • 举报
回复
你定义的两个变量,编译器并不管它们是全局还是局部都是从栈中分配的内
suyouxin 2007-11-19
  • 打赏
  • 举报
回复
楼主的一般用得太多了吧。

各个系统都不一样,比如嵌入式系统中如果使用实模式编程,这些段的位置都是可以通过配置文件指定在存储器的不同地址段的。

如果是windows这些系统,printf得到的都是虚拟地址,那么这些段地址都是在进程初始化时操作系统指定的,由内存管理模块映射出来的虚拟地址,比如code放哪,BSS放哪,data放哪

记得win32高级编程那本书有讲述windows的进程内存布局,楼主可以看看
zhdmxj 2007-11-17
  • 打赏
  • 举报
回复
内存的组织与编译器和系统是相关的,书上说的可能是基于unix下的
pwcrab 2007-11-16
  • 打赏
  • 举报
回复
感谢mrche的回复,但是,我的理解和你有一些不同:

分配内存是有三种模式:静态分配、栈分配,堆分配(栈分配,堆分配应该都属于动态分配)

不过这个观点好像无法解释我问的问题
mrche 2007-11-15
  • 打赏
  • 举报
回复
分配内存有三种模式,第一种是从栈中分配,一种是从堆中分配,还有一种是动态分配的。你定义的两个变量,编译器并不管它们是全局还是局部都是从栈中分配的内存。嘿嘿,个人理解,也不是很了解,说错了的请指正
pwcrab 2007-11-15
  • 打赏
  • 举报
回复
自己顶一下,没人了解吗?
本课程是在《数据大脑平台技术规划解决方案》和《数据大脑平台技术设计解决方案》课程基础上,重点解决智慧城市建设的数据质量核心问题,为城市大脑建设提供标准化、规范化数据,通过数据管控平台实现数据治理,真正做到数据可控、可用、可审计。面对每个独特的项目主体,我们在数据管控工作中经常遇到如下困惑: 1、面对数据来源多,数据壁垒严重,如何平衡数据干系人关切,建立数据大脑数据管控平台;2、面对复杂的项目环境,如何规划设计智慧城市数据管控体系,形成数据管控组织、评价考核等闭环管理机制,有效减少平台落地障碍;3、面对数据多样性及异构,如何设计元数据结构,建立数据标准,合理制定数据质量管理要求;4、如何根据业务需求,构建数据安全分级管理机制,成立数据管控组织,明确数据权责清单;5、如何规划设计数据管控工作流程,串联数据管控主导方,参与方,数据提供者,数据使用者。 针对以上数据管控共性问题和障碍,抛砖引玉,以期帮助大家提升数据治理规划设计能力和减少项目推进阻力,从而提高数据利用率和城市数据资产质量,为有效发挥数据价值提供保障。  为了更好的学习本课程并达到良好的效果,建议同时学习智慧城市《数据中台》、《售前管理》、《行业方案》和《城市大脑》系列相关课程,并请持续关注后续课程,谢谢。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧