内存
1. 内存分区
1.1 代码区
代码区时程序执行二进制指令的地方,代码区的空间储存的时自己已经写好运行的代码所在的内存空间。代码区,的权限只允许读取,代码区的数据是可以共享的。只读属性体现在程序在执行中无法修改(防止程序意外修改了它的指令)。并且也规划了局部变量的相关信息。
1.2 数据区
数据区又有:
- 未初始化的数据区(bss)
- 初始化数据区(data){包括静态局部变量和静态全局变量}
- 常量区
1.3 栈区(stack)
-
栈区时系统为每一个程序分配的一个临时空间。储存的有局部变量,函数信息,函数参数和数组。
-
具有先进后出的特点,由系统分配和释放
-
栈区的大小为1m
-
在windows中栈区可以扩展为10m
-
在linux中可以扩展到16m
1.4 堆区(heap)(取决你的内存大小)
- 用于存储大数据,图片,音乐,音频等文件
- 栈区需要手动开辟(malloc colloc realloc)
- 栈区的内存空间也需要手动释放(free)
在地址分配中,从低地址到高地址依次为:代码区<数据区(常量区)<数据区(data)<数据区(bss)<堆区 < 栈区
2. 执行过程
程序在加载到内存前,代码区和全局区(data和bss)的大小是固定的,程序运行期间不能改变。然后执行程序,系统将程序加载到内存。并且额外增加了栈区和堆区。
栈区
-
定义变量时是从高地址往低地址存储,并且不连续(防止其他程序的篡改)。
-
在存储数组时是先开辟一块空间,再由低地址往高地址存储数据
-
栈区的空间是由高地址往低地址增长
-
遵循先进后出,后进先出的规则
堆区
- 动态内存分配
- 需要手动开辟和释放
- 如果不释放,系统将在程序结束时释放
资料参考
b站的黑马程序员
评论





