在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
源文件在out文件種對應的部分
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[]是分開存的