C 的記憶體空間 堆疊

2021-08-25 14:20:53 字數 1186 閱讀 2365

c++記憶體空間布局圖示對照。

命令列引數和環境變數

stack

棧heap

堆bss

未初始化資料段

data

初始化資料段

text

正文段linux下32位記憶體空間分布圖。

1.命令列引數和環境變數

shell在執行程式的時候呼叫exec函式將命令列引數傳遞給要執行的程式。

使程式了解程序環境,在執行時分配空間。

2.bss段(block start by symbol)

存放未初始化的全域性變數或者靜態變數。

3.data段

存放具有明確初始值的全域性變數或者靜態變數。

存在於程式映象檔案中,由 exec 函式從程式映象檔案中讀入記憶體。

4.text段

cpu執行的機器指令。

棧:系統自動開闢空間,自動分配自動**,在作用域執行完成後(函式返回時)就會被**。

堆:由程式設計師自己申請空間,釋放空間,不釋放會出現記憶體洩漏。

1.棧是連續的向下擴充套件的資料結構,總共只有1m或者2m的空間。空間不足就會異常提示棧溢位。

2.儲存自動變數, 函式呼叫者資訊, 包括函式引數(可變引數列表的壓棧方向是從右向左), 函式內區域性變數, 函式返回值, 函式呼叫時的返回位址。

1.堆是不連續的向上擴充套件的資料結構,大小受限於計算機系統虛擬記憶體的大小。

2.作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。

對於大多數系統,會在這塊記憶體空間中的首位址處(一般為乙個位元組的大小)記錄本次分配的大小,這樣,**中的 delete語句才能正確的釋放本記憶體空間。

由於找到的堆結點的空間大小可能大於申請的大小,系統會自動的將多餘的那部分(即記憶體碎片)重新放入空閒鍊錶中。這就涉及到申請效率的問題。

C 記憶體空間

乙個c 程式編譯後占用的記憶體分為如下幾個部分 棧 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。堆 由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os 存放由new,malloc分配的記憶體,可...

c 記憶體空間

題目 若char是一位元組,int是4位元組,指標型別是4位元組,如下 class ctest virtual void mem fun private char m chdata int m ndata static char s chdata char ctest s chdata 0 靜態成員...

c 記憶體空間

乙個可執行程式指令碼可以分為3個基本段,段,資料段,bss段 unix下可以使用size命令檢視可執行檔案的段大小資訊,size a.out header text 資料data bss 2 資料段.data 存放編譯階段就能確定的資料,可讀寫 3 段.text 段通常指用來存放執行d 的一塊儲存區...