在 C 语言中,内存分配主要分为以下几个区域:
一、栈(Stack)
-
存储内容:
- 局部变量:在函数内部声明的变量,包括自动变量和函数参数。
- 函数调用信息:当函数被调用时,会在栈上分配空间来存储函数的返回地址、参数和局部变量。
-
特点:
- 内存由编译器自动管理,分配和释放非常高效。
- 空间相对较小,一般几兆字节到几十兆字节。
- 先进后出(FILO)的数据结构,函数调用结束后,局部变量的内存会自动释放。
二、堆(Heap)
-
存储内容:
- 通过动态内存分配函数(如 malloc、calloc、realloc 等)分配的内存块。
- 可以存储任意大小的数据结构,如大型数组、结构体等。
-
特点:
- 内存由程序员手动管理,需要显式地调用 free 函数释放内存,否则会导致内存泄漏。
- 空间相对较大,可以根据程序的需要动态分配和释放。
- 分配的内存地址是随机的,不像栈那样有固定的增长方向。
三、全局/静态存储区
-
存储内容:
- 全局变量:在函数外部声明的变量,在整个程序的生命周期内都存在。
- 静态变量:使用 static 关键字声明的变量,包括静态局部变量和静态全局变量。
-
特点:
- 在程序编译时分配内存,在程序结束时释放。
- 全局变量和静态变量的初始化只在程序启动时进行一次。
四、常量存储区
-
存储内容:
- 常量字符串、常量数值等不可修改的数据。
-
特点:
- 内存中的数据在程序运行期间不能被修改。
- 通常由编译器分配和管理。
五、代码区
-
存储内容:
- 程序的机器代码。
-
特点:
- 只读区域,存储着程序的指令。
- 由操作系统加载到内存中,在程序运行期间不会被修改。