C语言对内存的使用划分为以下区域:

栈区(stack)、堆区(heap)、全局区(静态区)、常量区、代码区。

  • 栈区

    • 由编译器自动分配释放,按内存地址从高(地址)到低(地址)存储;
    • 栈区内容的作用域为其所定义的函数内,生命周期为函数执行期间,函数结束自动释放;
    • 存放局部变量const局部变量、函数调用时的入口参数返回值
    • 栈区内容先进后出;
  • 堆区

    • 堆区内存由程序员管理,堆区空间申请后使用(申请时注意保存地址,防止内存泄漏),用完后一定及时手动释放,防止内存泄漏;
    • 堆区存储由低地址向高地址存储,内容可读可写;
    • 申请方法:

    void *malloc(size_t size);
    void free(void *ptr);
    void *calloc(size_t nmemb, size_t size);
    void *realloc(void *ptr, size_t size);

  • 全局(静态)区

    • 由系统管理,全局(静态)区内容的生命周期为整个程序运行期间;
    • 存放全局变量和static修饰的静态变量(包括静态全局变量静态局部变量);初始化的放在一块,未初始化的放在一块;
    • 全局变量和静态全局变量的作用域均为全局,但其他源文件可以通过extern关键字声明之后引用全局变量,而不能引用静态全局变量
    • 静态局部变量只在其定义函数内可见;
  • 常量区

    • 由系统管理,存放常量,const全局变量,只读;
  • 代码区

    • 由系统管理,存放程序的二进制代码,只读;

参考文章:
C语言:内存分配—栈区、堆区、全局区、常量区和代码区
c语言中的五种内存分区-笔记
c语言内存分区-(堆,栈,全局/静态存储区,自由存储区,代码区)与可执行程序的三段-(Text段,Date段,Bss段)