# C 语言经过编译之后将内存分为以下几个区域:
# (1)栈(stack):
由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。
# (2)堆(heap):
用于程序动态申请分配和释放空间。C 语言中的 malloc 和 free,C++ 中的 new 和 delete 均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的 “堆” 并不是数据结构中的 “堆”。
# (3)全局(静态)存储区:
分为 DATA 段和 BSS 段。DATA 段(全局初始化区)存放初始化的全局变量和静态变量;BSS 段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中 BBS 段在程序执行之前会被系统自动清 0,所以未初始化的全局变量和静态变量在程序执行之前已经为 0。
# (4)文字常量区:
存放常量字符串。程序结束后由系统释放。
# (5)程序代码区:
存放程序的二进制代码。
显然,C 语言中的全局变量和局部变量在内存中是有区别的。C 语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。