C中的内存分配模型

在 C 语言中,内存分配主要分为以下几个区域:

一、栈(Stack)

  1. 存储内容

    • 局部变量:在函数内部声明的变量,包括自动变量和函数参数。
    • 函数调用信息:当函数被调用时,会在栈上分配空间来存储函数的返回地址、参数和局部变量。
  2. 特点

    • 内存由编译器自动管理,分配和释放非常高效。
    • 空间相对较小,一般几兆字节到几十兆字节。
    • 先进后出(FILO)的数据结构,函数调用结束后,局部变量的内存会自动释放。

二、堆(Heap)

  1. 存储内容

    • 通过动态内存分配函数(如 malloc、calloc、realloc 等)分配的内存块。
    • 可以存储任意大小的数据结构,如大型数组、结构体等。
  2. 特点

    • 内存由程序员手动管理,需要显式地调用 free 函数释放内存,否则会导致内存泄漏。
    • 空间相对较大,可以根据程序的需要动态分配和释放。
    • 分配的内存地址是随机的,不像栈那样有固定的增长方向。

三、全局/静态存储区

  1. 存储内容

    • 全局变量:在函数外部声明的变量,在整个程序的生命周期内都存在。
    • 静态变量:使用 static 关键字声明的变量,包括静态局部变量和静态全局变量。
  2. 特点

    • 在程序编译时分配内存,在程序结束时释放。
    • 全局变量和静态变量的初始化只在程序启动时进行一次。

四、常量存储区

  1. 存储内容

    • 常量字符串、常量数值等不可修改的数据。
  2. 特点

    • 内存中的数据在程序运行期间不能被修改。
    • 通常由编译器分配和管理。

五、代码区

  1. 存储内容

    • 程序的机器代码。
  2. 特点

    • 只读区域,存储着程序的指令。
    • 由操作系统加载到内存中,在程序运行期间不会被修改。