C語言 內存分配

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

  1. 正文區(Code or Text)
    名字有很多,有的稱為代碼段,代碼區等等。但是實質都是一樣的,都是用來存放程序編譯后形成的機器代碼。一般此內存區是只讀的,防止程序意外修改指令。
  2. 初始化數據段(RO/RW data segment)
    程序一經編譯好,該區域便存在,又被稱為數據區。該區包含了3種數據:1、在程序中明確被初始化的全局變量(int a=2);2、靜態變量(包括全局靜態變量和局部靜態變量);3、常量數據(如字符串常量)
  3. 未初始化數據段(BSS = Block Started by Symbol)
    這段儲存的數據是:在程序中聲明但是沒有初始化的變量,如全局變量(int a;)這些變量在程序運行之前是不需要占用存儲空間的.BSS段也屬于靜態內存分配,也可存放static申明的變量。
  4. 堆(heap)
    堆內存只在程序運行時出現,一般由程序員手動分配和釋放,一般可以使用malloc()/nalloc() & free() 函數來申請、釋放。在操作系統下,如果程序員沒釋放,一般操作系統可以在程序結束后回收內存
  5. 棧(stack)
    存放程序的局部變量(但不包括static聲明的變量)。除此以外,在函數被調用時,棧用來傳遞參數和返回值。

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

源文件在out文件種對應的部分
在例子中pear[40]和static double peach這兩個變量就是放在BBS里面的,因為只是申明了他們但并沒有初始化。而像初始化的mango和melon就是放在數據段里面的(又稱靜態區)。對于局部變量來說,他們要程序運行時才會在棧里面被創建

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[]是分開存的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容