C語言 記憶體分布詳解

2021-08-21 14:47:36 字數 1183 閱讀 7382

一、乙個c/c++程式占用的記憶體分為以下幾個部分:

堆區(heap):

全域性(靜態區)(static):

示例:

int a = 10;           //全域性變數---全域性(靜態)初始化區

int i; //全域性變數---全域性(靜態)未初始化區

main()

char s1 = "abcdef";         //s1 在靜態區,「abcdef」無需額外存放,存在陣列s1內部

const char *p1 ="abcd"; //p1在靜態區,「abcdef」在常量區,可以通過指標p1獲取到「abcd」

main()

二、申請後系統的處理方式

棧:只要棧剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將報錯(棧溢位)

堆:作業系統有乙個記錄空閒位址的鍊錶,當系統收到程式申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間大小的堆結點,然後從空閒鍊錶中刪除該結點,並將其空間分配給程式。對於大多數系統,會在其空間首位址處記錄該空間大小,以便於free/delete時釋放正確的記憶體空間,另外,程式獲取到的空間可能大於所申請空間,多於部分系統會重新釋放至空閒鍊錶中。

三、申請大小限制

棧:在window中,棧由高位址向低位址擴充套件的一塊連續的記憶體區域,window中棧的大小是2m(不一定),如果申請空間大於棧剩餘空間時將會提示stack overflow(棧溢位),因此棧能獲取的空間較小。

堆:堆是由低位址向高位址擴充套件的一塊不連續的記憶體區域,堆的大小受限於計算機中有效虛擬記憶體,且系統是用鍊錶儲存空閒記憶體位址,空間可不連續,因此堆的儲存比較靈活,也比較大。

四、申請效率

棧:棧記憶體分配運算內置於處理器指令集中,效率很高,但分配的記憶體容量有限,程式設計師無法控制

堆:由動態記憶體開闢,一般速度比較慢,容易產生記憶體碎片,使用結束後需程式設計師自行釋放記憶體空間

C語言記憶體空間分布詳解

bss段 bss segment 通常是指用來存放程式中 未初始化 的全域性變數 的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。資料段 資料段 data segment 通常是指用來存放程式中 已初始化 的全域性變數 的一塊記憶體區域...

C語言記憶體空間分布詳解

bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。資料段 資料段 data segment 通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於...

C語言記憶體分布

動態記憶體分配,c語言動態記憶體分配詳解 c語言知識總結 十一 記憶體管理 c語言記憶體分布圖 段 const常量,字串常量 資料段 已初始化全域性變數 已初始化全域性靜態變數 區域性靜態變數 常量資料 bss段 未初始化全域性變數 未初始化全域性靜態變數 棧 區域性變數 函式引數 堆 動態記憶體分...