C語言程式的儲存區域 記憶體布局

2021-06-28 03:16:25 字數 2186 閱讀 7958

c語言程式的儲存區域

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

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

1.**段(code或text)

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

2.唯讀資料段(ro data)

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

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

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

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

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

5.堆(heap)

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

6.棧(stack)

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

看乙個例子:

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

static int b=20;//全域性初始化區。 data段

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

const int a = 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.函式的返回值

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

記憶體分配方式有三種:

(1) 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數

(2) 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。

(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc 或new申請任意多少的記憶體,程式設計師自己負責在何時用free 或delete 釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多

**:

C語言程式的儲存區域

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

靜態區域和動態區域記憶體的分配

動態區域分配記憶體 include using namespace std char stra void getmemory char p,int num int main 這是在動態區域中分配記憶體 char str null 這只是宣告了乙個指標,並沒有給指標分配位址,也就是說如果想用這個指標,...

C語言程式記憶體區域組成

重點關注以下內容 c語言程式在記憶體中各個段的組成 c語言程式連線過程中的特性和常見錯誤 c語言程式的執行方式 由c語言 文字檔案 形成可執行程式 二進位制檔案 需要經過編譯 彙編 連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機器 連線過程則將各個原始檔...