首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于C中全局变量空间分配的有关问题

2013-03-22 
关于C中全局变量空间分配的问题全局变量是在程序编译时就被分配好了空间,并且存储在数据段当加载到内存中

关于C中全局变量空间分配的问题
全局变量是在程序编译时就被分配好了空间,并且存储在数据段
当加载到内存中运行的时候,系统还需要为其在内存上分配空间,并且分配的空间在堆上,只不过将名字改为数据区。等将程序全部的段都在内存上分配好空间以后,剩下的就是可以malloc的动态内存区。


可以这样理解吗,一直很疑惑。

大家讨论一下哈 C? 全局变量 空间分配 堆
[解决办法]
个人理解:
加载大概是这个样子:
1)程序在编译后会分为代码段、数据段等,在加载的时候,虚拟内存中不止有你的程序还有操作系统,也就是说4G的虚存中需要有1~2G的空间被操作系统占用了,这些剩下的空间中保留空间也不能使用,剩下的才能被程序使用,例如将指针赋值为空的时候就是指向了保留空间中的低地址空间,他们不能读也不能写;
2)程序在编译、链接之后的可执行文件(格式为ELF或PE)中包含了可执行文件头部、段表、各个段(包括代码段、数据段等),这些内容都需要加载进入虚拟内存,当然代码段、数据段都会分别加载到不同的位置,这些位置可能不是你编译时生成的那些地址(这时候就需要重定位)。
3)在空间分配上,除了操作系统占用、保留区占用、加载的程序占用,剩下的部分中(可以这么理解,但不一定所有的操作系统都这样)顶部会被栈使用,从加载结束位置向上被堆使用。
4)程序被加载进入内存之后,就会调用入口函数或动态链接器执行程序。

你的问题中:
未初始化的全局变量或静态变量在编译的时候不会分配内存,可能在加载的时候会为之分配。
但是,对于已经初始化的全局或静态变量在编译的时候就需要为之分配内存保存那些初始化的值,这时它们一般会被编译进data段(在linux下),这时这些变量所占用的空间也就被分配了,在加载的时候,data段会被整个加载入内存,因此其对应的空间也被加载到了内存,而不是在堆中再进行分配,堆中都是用malloc、new之类的动态申请的,而不是编译时候就占用的。
[解决办法]

引用:
个人理解:
加载大概是这个样子:
1)程序在编译后会分为代码段、数据段等,在加载的时候,虚拟内存中不止有你的程序还有操作系统,也就是说4G的虚存中需要有1~2G的空间被操作系统占用了,这些剩下的空间中保留空间也不能使用,剩下的才能被程序使用,例如将指针赋值为空的时候就是指向了保留空间中的低地址空间,他们不能读也不能写;
2)程序在编译、链接之后的可执行文件(格式为E……



// 纠正一下,编译时不涉及到内存
// 未初始化的全局变量或静态变量在编译的时候不会分配内存==未初始化的全局变量或静态变量在文件中不占用
// 存储空间,被加载时.bss段用0填充

[解决办法]
理解之前请先观察!

VMMap 是进程虚拟和物理内存分析实用工具。
http://technet.microsoft.com/zh-cn/sysinternals/dd535533

热点排行