在C语言中,地址的由低到高基本由如下5个存储区组成:
-
正文区(Code or Text)
名字有很多,有的称为代码段,代码区等等。但是实质都是一样的,都是用来存放程序编译后形成的机器代码。一般此内存区是只读的,防止程序意外修改指令。 -
初始化数据段(RO/RW data segment)
程序一经编译好,该区域便存在,又被称为数据区。该区包含了3种数据:1、在程序中明确被初始化的全局变量(int a=2);2、静态变量(包括全局静态变量和局部静态变量);3、常量数据(如字符串常量) -
未初始化数据段(BSS = Block Started by Symbol)
这段储存的数据是:在程序中声明但是没有初始化的变量,如全局变量(int a;)这些变量在程序运行之前是不需要占用存储空间的.BSS段也属于静态内存分配,也可存放static申明的变量。 -
堆(heap)
堆内存只在程序运行时出现,一般由程序员手动分配和释放,一般可以使用malloc()/nalloc() & free() 函数来申请、释放。在操作系统下,如果程序员没释放,一般操作系统可以在程序结束后回收内存 -
栈(stack)
存放程序的局部变量(但不包括static声明的变量)。除此以外,在函数被调用时,栈用来传递参数和返回值。
我们来通过例子具体看看一个程序在内存的存放,一个a.c文件通过编译后会生成执行文件a.out
我们再通过一个程序的例子来分析里面每个变量的存放情况:
int a = 0; //a在全局已初始化数据区(Data区)
char *p1; //p1在BSS区(未初始化全局变量)
Define Pi 3.14 //常量,在Data区
main()
{
int b; //b在栈区
char s[] = "abc"; //s为数组变量,存储在栈区,"abc"为字符串常量,存储在已初始化数据区
char *p1,p2; //p1、p2在栈区
char *p3 = "123456"; //123456\0在已初始化数据区,p3在栈区
static int c =0; //c为全局静态变量,存在于已初始化数据区,静态数据会自动初始化
p1 = (char *)malloc(10);//分配得来的10个字节的区域在堆区
p2 = (char *)malloc(20);//分配得来的20个字节的区域在堆区
free(p1);
free(p2);
}
注意:上面的“abc”是属于常量,它和s[]是分开存的