二 C语言存储模型
运行时结构内容参考自:编译系统透视图解编译原理
C程序开发并编译完成后,是要载入内存(主存或内存条)才能运行,变量名、函数名都会对应内存中的一块区域。
1 内存模型
其实内存中运行着很多程序,C程序只占用其中一小部分空间,这部分空间又可以细分为以下的区域:
1. 程序代码区——存放计算机可识别的函数体的二进制代码
2. 静态数据区——也称全局数据区,包含的数据类型比较多,如全局变量、静态变量、常量数据。其中:
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
常量数据(一般常量、字符串常量)存放在另一个区域。
注意:静态数据区的内存在程序结束后由操作系统释放。
3. 堆区——一般由程序员分配和释放,若程序员不释放,程序运行结束时由操作系统回收。malloc()、calloc()、free() 等函数操作的就是这块内存。
4. 栈区——由系统自动分配释放,存放函数的参数值、局部变量的值等。
C语言内存模型图如下:
为了更好的理解内存模型,请大家看下面一段代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a = 0; // 全局初始化区
char *p1; // 全局未初始化区
int main()
{
int b; // 栈区
char s[] = "abc"; // 栈区
char *p2; // 栈区
char *p3 =