内存的各个区

本文详细介绍了内存分区的构成,包括系统区和用户区的划分,以及用户区下的代码区、数据区(静态和动态),如全局数据区、文字常量区、堆区和栈区的作用和特性。同时提到了内存管理和引用的资源链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存分区

内存单元可以分为系统区(操作系统使用)和用户区(用户程序使用)两部分。

分类说明
内存系统区操作系统使用
用户区用户程序使用

用户区:分为代码区(code area、程序代码区,存放程序的二进制代码)和数据区(存放程序数据)。

分类说明
用户区代码区code area、程序代码区,存放程序的二进制代码
数据区存放程序数据

数据区:分为静态数据区(静态区,有最长生存期)和动态数据区(动态区,有较短生存期)。

分类说明
数据区静态数据区也称“静态存储区”,分为全局数据区和文字常量区;程序运行前就分配好了,静态存储区中的数据在程序运行期间一直存在,直到程序结束才被释放
动态数据区也称“动态存储区”,分为堆区(heap area、堆空间)和栈区(stack area、栈空间);程序运行起来之后才会使用
内存
系统区
用户区
代码区
数据区
共享地址空间
进程控制块
静态数据区
动态数据区
全局数据区
文字常量区
堆区
栈区

内存各个区的作用

程序代码区(code area):存储程序的执行代码(二进制代码),包括函数、指令和程序逻辑。两个特点:
只读:不能被修改,使其只读的原因是防止程序意外地修改了代码区的指令。
共享:目的是对于频繁执行的程序,只需要在内存中有一份代码即可。

全局数据区(data area):存放的是全局变量静态变量(常指局部静态变量,包括全局静态变量和局部静态变量)。
初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在(有时初始化区和未初始化区不一定相邻)另一块区域,将初始化为0(字符与字符串初始化并不不相同)。在编译时分配,结束时由系统释放。

文字常量区(位于静态数据区):用于存储常量(常变量、字面量)数据。字面量,例如字符串常量。这个区域的数据在程序运行期间不可修改。 程序结束后由系统释放。

栈区(stack area):存放的是局部变量const修饰的局部变量(局部常变量)函数参数调用函数的状态返回地址等。
自高地址向低地址扩展或自低地址向高地址扩展(不同芯片不一样)。由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(只有一个方向能插入与删除,即栈顶)。
栈区是一块内存区域,用于存储函数调用和局部变量。它具有后进先出(Last In, First Out)的特性,因此最后进入栈区的数据首先被移出。栈区的大小通常是固定的,栈区上的内存管理是由编译器自动处理的。

堆区(heap area)
程序员自动申请的内存(动态申请的内存)被分配到堆空间,由程序员自己释放, 若程序员不释放,程序结束时可能由操作系统回收 。
堆是动态分配的内存区域,用于存储动态创建的数据,例如通过new和malloc函数分配的对象。堆的大小可以根据需要在运行时进行调整,但需要手动释放分配的内存,以避免内存泄漏。

参考文献

https://blog.youkuaiyun.com/hrlnldy/article/details/8018076
http://yncoders.com/show/4727

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值