text data bss stack heap 段

根據APUE,程序分爲下面的段:.text, data (initialized), bss, stack, heap。
data/bss/text: 
text段在內存中被映射爲只讀,但.data和.bss是可寫的。
bss是英文Block Started by Symbol的簡稱,通常是指用來存放程序中未初始化的全局變量的一塊內存區域,在程序載入時由內核清0。BSS段屬於靜態內存分配。它的初始值也是由用戶自己定義的連接定位文件所確定,用戶應該將它定義在可讀寫的RAM區內,源程序中使用malloc分配的內存就是這一塊,它不是根據data大小確定,主要由程序中同時分配內存最大值所確定,不過如果超出了範圍,也就是分配失敗,可以等空間釋放之後再分配。
text段是程序代碼段,在AT91庫中是表示程序段的大小,它是由編譯器在編譯連接時自動計算的,當你在鏈接定位文件中將該符號放置在代碼段後,那麼該符號表示的值就是代碼段大小,編譯連接時,該符號所代表的值會自動代入到源程序中。
data包含靜態初始化的數據,所以有初值的全局變量和static變量在data區。段的起始位置也是由連接定位文件所確定,大小在編譯連接時自動分配,它和你的程序大小沒有關係,但和程序使用到的全局變量,常量數量相關。
stack/heap:
棧(stack)保存函數的局部變量和參數。是一種“後進先出”(Last In First Out,LIFO)的數據結構,這意味着最後放到棧上的數據,將會是第一個從棧上移走的數據。對於哪些暫時存貯的信息,和不需要長時間保存的信息來說,LIFO這種數據結構非常理想。在調用函數或過程後,系統通常會清除棧上保存的局部變量、函數調用信息及其它的信息。棧另外一個重要的特徵是,它的地址空間“向下減少”,即當棧上保存的數據越多,棧的地址就越低。棧(stack)的頂部在可讀寫的RAM區的最後。

堆(heap)保存函數內部動態分配內存,是另外一種用來保存程序信息的數據結構,更準確的說是保存程序的動態變量。堆是“先進先出”(First In first Out,FIFO)數據結構。它只允許在堆的一端插入數據,在另一端移走數據。堆的地址空間“向上增加”,即當堆上保存的數據越多,堆的地址就越高。

他們在程序中的存儲詳情如下:

char *string "Hello World";
int iSize;

char *fun(void)
{
     char *p;
     iSize = 8;
     p = malloc(iSize);
     
return p;
}

存放的位置(相同的顏色對應)


Text段:上面標記爲紅色的部分(還包括整個fun函數,由於下邊需要,所以沒有標記)都存放在Text段,Text段用來存放代碼(二進制文件)和常量,該段的數據通常是隻讀的

例:

  1. char *p = "Hello";  
  2.   
  3. p[0] = 'a';  
  1. char *p = "Hello";  
  2.   
  3. p[0] = 'a';  

 VC6.0下,編譯無錯,但運行是提示內存不可寫,這就是因爲"Hello"存放在Text段,它是隻讀的,你不能去修改它.


Data段: 已經初始化了的全局變量string就存放在該段,Data段用來存放初始化了的變量,即初始化了的全局變量和靜態變量

 

BSS段: 未初始化的全局變量iSize存放在這,BSS段主要存放在未初始化的變量,即未初始化的全局變量和靜態變量

 

Heap段: 程序員手動分配的malloc(iSize)這篇內存存放在該段,也需要用戶自行釋放

 

Stack段:函數裏的局部變量*p存放在該段,Stack段主要存放局部變量、臨時變量、函數相互調用的返回的地址,該段由編譯器自行分配和釋放

 

那接下來我們來看看,它們什麼被分配了內存,什麼時候釋放內存:


全局變量和靜態變量:程序開始的時候就分配了,程序結束時候釋放內存。

局部變量:函數調用的時候爲變量分配內存,調用結束釋放內存。

堆裏的:調用malloc時分配內存,調用free時釋放。



發佈了11 篇原創文章 · 獲贊 19 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章