程序在内存中的分布

在现代的操作系统中,当我们说到内存,往往需要分两部分来讲: 物理内存和虚拟内存。从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间。

一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式。

低地址到高地址,可分为下面几段:  
预留内存地址(操作系统维护的内存地址,不可访问) 
程序代码区(只读,存代码和一些其他的东西); 
data段存初始化的全局变量和static变量,另外还有文字常量区,常量字符串就是放在这里,程序结束后由系统释放); 
bss段存未初始化的全局变量和static变量注意静态变量初始化为0跟未初始化是一样的,都放在bss段); 
(由低地址向高地址增长,一般new和malloc分配,由程序员分配释放);
共享库文件(调用的库文件,位于堆和栈之间);  
(由高地址向低地址增长,和堆的增长方式相对,对不同的OS来说,栈的初始大小有规定,可以修改,目前默认一般为2M,由编译器自动分配释放); 
再上面存的都是操作系统和内核调用的一些内存地址

如图所示:



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C的不同存储类变量在内存分布情况如下: 1. 自动变量():自动变量是在函内部声明的变量,默认情况下具有自动存类。它们存储在栈上,是一种后进先出(LIFO)的据结构。当函调用结束时,栈上的自动变量会自动释放。 2. 静态变量(static):静态变量在声明时使用关键字static,并存储据区。静态变量可以是全局的(在函外部定义)或局部的(在函内部定义)。全局静态变量在程序的整个执行期间都存在,而局部静态变量在函调用结束后仍然存在。 3. 寄存器变量(register):寄存器变量是通过关键字register声明的,用于请求编译器将变量存储在CPU寄存器,以便快速访问。然而,现代编译器通常会忽略register关键字的请求,并根据需要自动优化变量的存储位置。 4. 外部变量(extern):外部变量是在一个文件声明,但在其他文件使用的变量。它们存储据区,并且在程序的整个执行期间都存在。 5. 静态全局变量(static global):静态全局变量在一个文件声明,并且只能在该文件访问。它们存储据区,并且在程序的整个执行期间都存在。 6. 动态分配变量(动态内存分配):动态分配变量通过调用malloc()、calloc()或realloc()等函来分配内存。它们存储在堆,堆是一种动态分配内存的区域。动态分配的变量需要手动释放内存,以避免内存泄漏。 需要注意的是,以上是一般情况下的变量存储类别和内存分布情况,具体实现可能会因编译器、操作系统和硬件平台的不同而有所变化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值