C語言 內(nèi)存分配

在C語言中,地址的由低到高基本由如下5個存儲區(qū)組成:

  1. 正文區(qū)(Code or Text)
    名字有很多,有的稱為代碼段,代碼區(qū)等等。但是實質(zhì)都是一樣的,都是用來存放程序編譯后形成的機(jī)器代碼。一般此內(nèi)存區(qū)是只讀的,防止程序意外修改指令。
  2. 初始化數(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ù)(如字符串常量)
  3. 未初始化數(shù)據(jù)段(BSS = Block Started by Symbol)
    這段儲存的數(shù)據(jù)是:在程序中聲明但是沒有初始化的變量,如全局變量(int a;)這些變量在程序運行之前是不需要占用存儲空間的.BSS段也屬于靜態(tài)內(nèi)存分配,也可存放static申明的變量。
  4. 堆(heap)
    堆內(nèi)存只在程序運行時出現(xiàn),一般由程序員手動分配和釋放,一般可以使用malloc()/nalloc() & free() 函數(shù)來申請、釋放。在操作系統(tǒng)下,如果程序員沒釋放,一般操作系統(tǒng)可以在程序結(jié)束后回收內(nèi)存
  5. 棧(stack)
    存放程序的局部變量(但不包括static聲明的變量)。除此以外,在函數(shù)被調(diào)用時,棧用來傳遞參數(shù)和返回值。

我們來通過例子具體看看一個程序在內(nèi)存的存放,一個a.c文件通過編譯后會生成執(zhí)行文件a.out

源文件在out文件種對應(yīng)的部分
在例子中pear[40]和static double peach這兩個變量就是放在BBS里面的,因為只是申明了他們但并沒有初始化。而像初始化的mango和melon就是放在數(shù)據(jù)段里面的(又稱靜態(tài)區(qū))。對于局部變量來說,他們要程序運行時才會在棧里面被創(chuà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[]是分開存的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容