C語言程式的記憶體布局

2021-06-18 11:12:53 字數 2272 閱讀 5581

c語言程式的記憶體布局

章介紹c語言程式的記憶體布局結構,包括連線過程中目標程式各個段的組成和執行過程中各個段載入的情況。

在本章的學習中,讀者應重點關注以下內容:

c語言程式在記憶體中各個段的組成

c語言程式連線過程中的特性和常見錯誤

c語言程式的執行方式

13.1  c語言程式的儲存區域

由c語言**(文字檔案)形成可執行程式(二進位制檔案),需要經過編譯-彙編-連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機器**,連線過程則將各個原始檔生成的二進位制機器**檔案組合成乙個檔案。

c語言編寫的程式經過編譯-連線後,將形成乙個統一檔案,它由幾個部分組成。在程式執行時又會產生其他幾個部分,各個部分代表了不同的儲存區域:

1.**段(code或text)

**段由程式中執行的機器**組成。在c語言中,程式語句進行編譯後,形成機器**。在執行程式的過程中,cpu的程式計數器指向**段的每一條機器**,並由處理器依次執行。

2.唯讀資料段(ro data)

唯讀資料段是程式使用的一些不會被更改的資料,使用這些資料的方式類似查表式的操作,由於這些變數不需要更改,因此只需要放置在唯讀儲存器中即可。

3.已初始化讀寫資料段(rw data)

已初始化資料是在程式中宣告,並且具有初值的變數,這些變數需要占用儲存器的空間,在程式執行時它們需要位於可讀寫的記憶體區域內,並具有初值,以供程式執行時讀寫。

4.未初始化資料段(bss)

未初始化資料是在程式中宣告,但是沒有初始化的變數,這些變數在程式執行之前不需要占用儲存器的空間。

5.堆(heap)

堆記憶體只在程式執行時出現,一般由程式設計師分配和釋放。在具有作業系統的情況下,如果程式沒有釋放,作業系統可能在程式(例如乙個程序)結束後**記憶體。

6.棧(stack)

棧記憶體只在程式執行時出現,在函式內部使用的變數、函式的引數以及返回值將使用棧空間,棧空間由編譯器自動分配和釋放。

c語言目標檔案的記憶體布局如圖13-1所示。

圖13-1  c語言目標檔案的記憶體布局

**段、唯讀資料段、讀寫資料段、未初始化資料段屬於靜態區域,而堆和棧屬於動態區域。**段、唯讀資料段和讀寫資料段將在連線之後產生,未初始化資料段將在程式初始化的時候開闢,而堆和棧將在程式的執行中分配和釋放。

c語言程式分為映像和執行時兩種狀態。在編譯-連線後形成的映像中,將只包含**段(text)、唯讀資料段(ro data)和讀寫資料段(rw data)。在程式執行之前,將動態生成未初始化資料段(bss),在程式的執行時還將動態形成堆(heap)區域和棧(stack)區域。

一般來說,在靜態的映像檔案中,各個部分稱之為節(section),而在執行時的各個部分稱之為段(segment)。如果不詳細區分,可以統稱為段。

知識點:c語言在編譯和連線後,將生成**段(text)、唯讀資料段(ro data)和讀寫資料段(rw data)。在執行時,除了以上三個區域外,還包括未初始化資料段(bss)區域和堆(heap)區域和棧(stack)區域。

(1)靜態儲存:靜態分配是一種最簡單、最原始,同時也是一種最安全的分配方式,採用這種方式分配的變數,在程式進行編譯的時候,就獲得了乙個唯一而且不變的儲存空間,就好比是「從單位分到了房子」。正是因為這種分房子的策略,程式在編譯的時候,「變數總共需要多少空間」,「現有的空間夠不夠」,「變數應該放在什麼地方」,這些問題的答案從一開始就是明確的。一旦出現空間不足的情況,編譯器會立即向我們報告。c語言中,所以得全域性變數和靜態的區域性變數採用的都是靜態分配的。

(2)棧式分配。利用棧後入先出的特點,棧式分配主要被用於區域性變數的空間分配。這種好比「出租房」的分配策略,能在最大程度上提高儲存空間的使用效率---某個函式被呼叫時,區域性變數會從軟體堆疊中獲得乙個儲存空間;當函式退出時,該函式區域性變數所占用的空間就又被釋放出來以供他用。正是因為棧式分配的存在,使遞迴函式稱為可能。

(3)堆式分配:堆式乙個相對複雜的資料結構。本書不做討論。我們需要知道的是,堆能夠隨意按照我們的需求將一塊完整的乳酪一般「切出」我們所申請的份額。當這一空間不再有用,需要釋放這一空間時,我們就歸還這塊「乳酪」。系統會在此時試圖將幾塊彼此相鄰的小「乳酪」拼接成一塊較大的「乳酪」。正是因為這種方式的靈活性,堆式分配是我們構建複雜資料結構的常用手段。

C語言程式的記憶體布局

c語言程式的記憶體布局 一 c語言程式的儲存區域 1.段 code or text 段由程式中的機器碼組成。在c語言中,程式語句進行編譯後,形成機器 在執行程式的過程中,cpu的程式計數器指向 段的每一條 並由處理器依次執行。2.唯讀資料段 ro data 唯讀資料段是程式使用的一些不會被更改的資料...

C語言程式的記憶體如何布局

由c語言 文字檔案 形成可執行程式 二進位制檔案 需要經過編譯 彙編 連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機器 連線過程則將各個原始檔生成的二進位制機器 檔案組合成乙個檔案。c語言編寫的程式經過編譯 連線後,將形成乙個統一檔案,它由幾個部分組成。...

C語言程式設計 程式的記憶體布局

一 c語言程式的儲存區域 由c語言 文字檔案 形成可執行程式 二進位制檔案 需要經過編譯 彙編 連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機器 連線過程則將各個原始檔生成的二進位制機器 檔案組合成乙個檔案。c語言編寫的程式經過編譯 連線後,將形成乙個統...