C语言-内存模型

本文最后更新于:1 年前

程序内存在地址空间中的分布情况称为内存模型(Memory Model),由操作系统构建,受编译模式影响

对于32位环境,理论上有4G虚拟地址空间,但要拿出一部分给操作系统内核使用,应用程序无法直接访问这一段内存,这一部分内存地址被称为内核空间(Kernel Space)

Windows 在默认情况下会将高地址的 2GB 空间分配给内核(也可以配置为1GB),而 Linux 默认情况下会将高地址的 1GB 空间分配给内核。也就是说,应用程序只能使用剩下的 2GB 或 3GB 的地址空间,称为用户空间(User Space)

Linux 32位环境下用户空间

img

内存分区 说明
程序代码区 (code) 存放函数体的二进制代码。一个C语言程序由多个函数构成,C语言程序的执行就是函数之间的相互调用。
常量区 (constant) 存放一般的常量、字符串常量等。这块内存只有读取权限,没有写入权限,因此它们的值在程序运行期间不能改变。
全局数据区 (global data) 存放全局变量、静态变量等。这块内存有读写权限,因此它们的值在程序运行期间可以任意改变。
堆区 (heap) 一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()、calloc()、free() 等函数操作的就是这块内存,这也是本章要讲解的重点。 注意:这里所说的堆区与数据结构中的堆不是一个概念,堆区的分配方式倒是类似于链表。
动态链接库 用于在程序运行期间加载和卸载动态链接库。
栈区 (stack) 存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。

常量区和全局数据区有时也被合称为静态数据区

Linux 64位环境下用户空间

在64位环境下,虚拟地址空间大小为 256TB,Linux 将高 128TB 的空间分配给内核使用,而将低 128TB 的空间分配给用户程序使用。64位环境下虚拟地址只有低48位有效

Windows 32位环境下用户空间

  • 对于32位程序,内核占用较高的 2GB,剩下的 2GB 分配给用户程序;
  • 对于64位程序,内核占用最高的 248TB,用户程序占用最低的 8TB。