在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
我們再通過一個程序的例子來分析里面每個變量的存放情況:
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[]是分開存的