1. 内存分区

1.1 代码区

代码区时程序执行二进制指令的地方,代码区的空间储存的时自己已经写好运行的代码所在的内存空间。代码区,的权限只允许读取,代码区的数据是可以共享的。只读属性体现在程序在执行中无法修改(防止程序意外修改了它的指令)。并且也规划了局部变量的相关信息。

1.2 数据区

数据区又有:

  1. 未初始化的数据区(bss)
  2. 初始化数据区(data){包括静态局部变量和静态全局变量}
  3. 常量区

1.3 栈区(stack)

  • 栈区时系统为每一个程序分配的一个临时空间。储存的有局部变量,函数信息,函数参数和数组。

  • 具有先进后出的特点,由系统分配和释放

  • 栈区的大小为1m

  • 在windows中栈区可以扩展为10m

  • 在linux中可以扩展到16m

1.4 堆区(heap)(取决你的内存大小)

  • 用于存储大数据,图片,音乐,音频等文件
  • 栈区需要手动开辟(malloc colloc realloc)
  • 栈区的内存空间也需要手动释放(free)

在地址分配中,从低地址到高地址依次为:代码区<数据区(常量区)<数据区(data)<数据区(bss)<堆区 < 栈区


2. 执行过程

程序在加载到内存前,代码区和全局区(data和bss)的大小是固定的,程序运行期间不能改变。然后执行程序,系统将程序加载到内存。并且额外增加了栈区和堆区。


栈区

  • 定义变量时是从高地址往低地址存储,并且不连续(防止其他程序的篡改)。

  • 在存储数组时是先开辟一块空间,再由低地址往高地址存储数据

  • 栈区的空间是由高地址往低地址增长

  • 遵循先进后出,后进先出的规则

堆区

  • 动态内存分配
  • 需要手动开辟和释放
  • 如果不释放,系统将在程序结束时释放

资料参考

b站的黑马程序员