在C語言中,地址的由低到高基本由如下5個存儲區(qū)組成:
-
正文區(qū)(Code or Text)
名字有很多,有的稱為代碼段,代碼區(qū)等等。但是實質(zhì)都是一樣的,都是用來存放程序編譯后形成的機(jī)器代碼。一般此內(nèi)存區(qū)是只讀的,防止程序意外修改指令。 -
初始化數(shù)據(jù)段(RO/RW data segment)
程序一經(jīng)編譯好,該區(qū)域便存在,又被稱為數(shù)據(jù)區(qū)。該區(qū)包含了3種數(shù)據(jù):1、在程序中明確被初始化的全局變量(int a=2);2、靜態(tài)變量(包括全局靜態(tài)變量和局部靜態(tài)變量);3、常量數(shù)據(jù)(如字符串常量) -
未初始化數(shù)據(jù)段(BSS = Block Started by Symbol)
這段儲存的數(shù)據(jù)是:在程序中聲明但是沒有初始化的變量,如全局變量(int a;)這些變量在程序運行之前是不需要占用存儲空間的.BSS段也屬于靜態(tài)內(nèi)存分配,也可存放static申明的變量。 -
堆(heap)
堆內(nèi)存只在程序運行時出現(xiàn),一般由程序員手動分配和釋放,一般可以使用malloc()/nalloc() & free() 函數(shù)來申請、釋放。在操作系統(tǒng)下,如果程序員沒釋放,一般操作系統(tǒng)可以在程序結(jié)束后回收內(nèi)存 -
棧(stack)
存放程序的局部變量(但不包括static聲明的變量)。除此以外,在函數(shù)被調(diào)用時,棧用來傳遞參數(shù)和返回值。
我們來通過例子具體看看一個程序在內(nèi)存的存放,一個a.c文件通過編譯后會生成執(zhí)行文件a.out

源文件在out文件種對應(yīng)的部分

out文件在運行時對應(yīng)的內(nèi)存分配
我們再通過一個程序的例子來分析里面每個變量的存放情況:
int a = 0; //a在全局已初始化數(shù)據(jù)區(qū)(Data區(qū))
char *p1; //p1在BSS區(qū)(未初始化全局變量)
Define Pi 3.14 //常量,在Data區(qū)
main()
{
int b; //b在棧區(qū)
char s[] = "abc"; //s為數(shù)組變量,存儲在棧區(qū),"abc"為字符串常量,存儲在已初始化數(shù)據(jù)區(qū)
char *p1,p2; //p1、p2在棧區(qū)
char *p3 = "123456"; //123456\0在已初始化數(shù)據(jù)區(qū),p3在棧區(qū)
static int c =0; //c為全局靜態(tài)變量,存在于已初始化數(shù)據(jù)區(qū),靜態(tài)數(shù)據(jù)會自動初始化
p1 = (char *)malloc(10);//分配得來的10個字節(jié)的區(qū)域在堆區(qū)
p2 = (char *)malloc(20);//分配得來的20個字節(jié)的區(qū)域在堆區(qū)
free(p1);
free(p2);
}
注意:上面的“abc”是屬于常量,它和s[]是分開存的