C語言程式編譯後的儲存區域區分

2021-06-17 21:23:48 字數 2125 閱讀 2953

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

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

1.**段(code或text)

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

2.唯讀資料段(ro data)

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

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

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

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

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

5.堆(heap)

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

6.棧(stack)

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

看乙個例子:?

inta = 0;//全域性初始化區。        data段

staticintb=20;//全域性初始化區。  data段

char*p1;//全域性未初始化區         bss段

constinta = 10;//             rodata段

voidmain(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語言編寫的程式經過編繹 鏈結後,將形成乙個統一的檔案,它由幾個部分組成,在程式執行時又會產生幾個其他部分,各個部分代表了不同的儲存區域 段 code or text 段由程式中的機器碼組成。在c語言中,程式語句進行編譯後,形成機器 在執行程式的過程中,cpu的程式計數器指向 ...

C語言儲存區域

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

C C 語言程式的儲存區域

問題提出 看輸出結果,使用c1 c2 c3輸出字串都相同,但c1 c2 c3本身的內容不相同。9620588 1899312看出,完全是兩塊地方,推斷9620588屬於常量區,1899312屬於棧區。1899324 1899312 1899300這三個數可以看出指標區域為棧區。include std...