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

2021-08-02 19:07:32 字數 1875 閱讀 9046

一:c語言程式的儲存區域

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

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

1.**段(code或text)

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

2.唯讀資料段(ro data)

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

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

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

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

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

5.堆(heap)

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

6.棧(stack)

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

[cpp]view plain

copy

inta = 0;          

//全域性初始化區。   data段

static

intb=20;    

//全域性初始化區。   data段

char

*p1;           

//全域性未初始化區。  bss段

const

inta = 10;   

//                  rodata段

void

main(

void

)    

**段、唯讀資料段、讀寫資料段、未初始化資料段屬於靜態區域,而堆和棧屬於動態區域。**段、唯讀資料段和讀寫資料段將在鏈結之後產生,未初始化資料段將在程式初始化的時候開闢,而堆和棧將在程式的執行中分配和釋放。c語言程式分為映像和執行時兩種狀態。在編譯-連線後形成的映像中,將只包含**段(text)、唯讀資料段(ro data)和讀寫資料段(rw data)。在程式執行之前,將動態生成未初始化資料段(bss),在程式的執行時還將動態形成堆(heap)區域和棧(stack)區域。一般來說,在靜態的映像檔案中,各個部分稱之為節(section),而在執行時的各個部分稱之為段(segment)。如果不詳細區分,可以統稱為段。

在c語言的程式中,對變數的使用還有以下幾點需要注意:

1.函式體中定義的變數通常是在棧上,不需要在程式中進行管理,由編繹器處理。

2.用malloc,calloc,realloc等分配記憶體的函式所分配的記憶體空間在堆上,程式必須保證在使用free釋放,否則會發生記憶體洩漏。

3.所有函式體外定義的是全域性變數,加了static後的變數不管是在函式內部或外部都放在全域性區。

4.使用const定義的變數將放於程式的唯讀資料區。

棧空間主要用於以下3資料的儲存:

1.函式內部的動態變數

2.函式的引數

3.函式的返回值

棧空間是動態開闢與**的。在函式呼叫過程中,如果函式呼叫的層次比較多,所需要的棧空間也逐漸加大,對於引數的傳遞和返回值,如果使用較大的結構體,在使用的棧空間也會比較大.

C語言程式的記憶體布局

c語言程式的記憶體布局 章介紹c語言程式的記憶體布局結構,包括連線過程中目標程式各個段的組成和執行過程中各個段載入的情況。在本章的學習中,讀者應重點關注以下內容 c語言程式在記憶體中各個段的組成 c語言程式連線過程中的特性和常見錯誤 c語言程式的執行方式 13.1 c語言程式的儲存區域 由c語言 文...

C語言程式的記憶體布局

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

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

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