記憶體各個區域的區別

2021-07-05 22:18:56 字數 1431 閱讀 8922

名稱

內容

**段

可執行**、字串常量

資料段

已初始化全域性變數、已初始化全域性靜態變數、區域性靜態變數、常量資料

bss段

未初始化全域性變數,未初始化全域性靜態變數

區域性變數、函式引數

動態記憶體分配

一般情況下,乙個可執行二進位制程式(更確切的說,在linux作業系統下為乙個程序單元,在uc/osii中被稱為任務)在儲存(沒有調入到記憶體執行)時擁有3個部分,分別是**段(text)、資料段(data)和bss段。這3個部分一起組成了該可執行程式的檔案。

(1)**段(text segment):存放cpu執行的機器指令。通常**段是可共享的,這使得需要頻繁被執行的程式只需要在記憶體中擁有乙份拷貝即可。**段也通常是唯讀的,這樣可以防止其他程式意外地修改其指令。另外,**段還規劃了區域性資料所申請的記憶體空間資訊。

**段(code segment/text segment)通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。

(2)資料段(data segment):或稱全域性初始化資料段/靜態資料段(initialized data segment/data segment)。該段包含了在程式中明確被初始化的全域性變數、靜態變數(包括全域性靜態變數和區域性靜態變數)和常量資料。

(3)未初始化資料段:亦稱bss(block started by symbol)。該段存入的是全域性未初始化變數、靜態未初始化變數。

而當程式被載入到記憶體單元時,則需要另外兩個域:堆域和棧域。

(4)棧(stack):存放函式的引數值、區域性變數的值,以及在進行任務切換時存放當前任務的上下文內容。

(5)堆(heap):用於動態記憶體分配,即使用malloc/free系列函式來管理的記憶體空間。

在將應用程式載入到記憶體空間執行時,作業系統負責**段、資料段和bss段的載入,並將在記憶體中為這些段分配空間。棧也由作業系統分配和管理,而不需要程式設計師顯示地管理;堆由程式設計師自己管理,即顯示地申請和釋放空間。

深入C語言記憶體區域分配 程序的各個段 詳解

一般情況下,乙個可執行二進位制程式 更確切的說,在linux作業系統下為乙個程序單元,在uc osii中被稱為任務 在儲存 沒有調入到記憶體執行 時擁有3個部分,分別是 段 text 資料段 data 和bss段。這3個部分一起組成了該可執行程式的檔案 c語言可執行 結構 名稱內容 段可執行 字串常...

記憶體區域的布局

常見的記憶體空間分為 區 儲存可執行的 全域性資料區 儲存全域性變數和靜態變數 int a abcd 棧區 堆區 include include 動態分配記憶體 為什麼需要動態分配記憶體 1.儲存的資料 需要延長生命週期 2.乙個指標變數需要儲存資料,變數本身只能存位址 不能存資料,需要分配記憶體空...

記憶體區域dump

程式除錯中,經常需要輸出記憶體資訊,以便進一步分析,下面是我寫的乙個簡單的輸出函式 sprintf hex i 3,02x str i 0xff printf 0x 3.2s in size cur 中 3.2s 表示輸出字串,寬度為3,精度為2 精度表示最多輸出兩個字元,多的捨去 左對齊,右填充空...