一般来说, 每个 C 语言编写的程序都需要经过保存, 预处理, 编译, 汇编, 链接, 最后生成二进制可执行文件, 然后才能运行. 这个可执行文件在运行之前, 存放在电脑硬盘; 执行的时候, 被调入内存.
同时, 我们要了解: 组成 C 语言程序的不同的元素 (如变量, 常量, 指令等) 要放在内存中不同的地方, 我们看下图:
这个就是内存的分区表格, C 编译器将内存划分成几个分区, 将 C 语言程序的不同元素放入不同的分区. 不同分区不仅仅存放的程序元素不同, 而且生命周期不同. 管理内存加载和释放的管理者也不同. 代码区和程序数据区 (或者叫静态区, 全局区) 是编译器 (也许是操作系统) 管理, 堆区是程序员管理(有的编译器也帮助管理, 作为防火墙性质地存在, 防止程序员忘记释放内存), 栈区则是实时加载和释放, 函数的参数值, 返回值, 局部变量等随着函数运行结束, 自动加载, 自动释放(这个应该是编译器管理).
其实, 按照 C 语言程序的生命周期, 整个内存分区可以分为三个部分:
第一部分: 代码区和程序数据区, 存放指令和全局变量, 静态变量, 常量, 生命周期是整个程序运行过程.
第二部分: 堆区, 存放内容及生命周期由程序员指定.
第三部分: 栈区, 存放函数的参数值, 返回值, 局部变量, 相关内存的内容随着程序结束运行而释放.
来源: http://www.bubuko.com/infodetail-3093920.html