C語言程式記憶體分布

2022-08-20 18:48:16 字數 1117 閱讀 3579

乙個程序的資料在記憶體中的布局如下圖:

bss段(bss segment):可讀可寫不可執行,通常用來存放程式中未初始化的全域性變數。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。

data段(data segment):可讀可寫不可執行,通常用來存放程式中已初始化的全域性變數。data段屬於靜態記憶體分配。

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

堆(heap):可讀可寫可執行,通常用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)。

棧(stack):可讀可寫可執行,是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。

bss段與data段區別:

bss段存放那些沒有初始化的和初始化為0的全域性變數。

data段存放那些已經初始化的且不為0的全域性變數。

堆和棧的區別:

堆由程式設計師動態申請釋放,類似乙個資源池,空間很大,通過指標進行管理。

棧由程式根據需要自動進行擴充套件或縮小,即壓棧與出棧,所以程式設計時需要注意棧的大小,盡量不要定義大陣列的區域性變數,盡量避免過多層次的函式巢狀。

C程式記憶體分布

1 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數值等。2 堆區 heap 一般由程式設計師分配釋放,隨叫隨到,揮之即走。3 全域性 靜態區 static 全域性變數和靜態變數的儲存是放在一起的,在程式編譯時分配。4 文字常量區 存放常量字串。5 程式 區 存放函式體 包括類的...

C 程式記憶體分布

程式中變數的記憶體分配方式 程式執行時需要占用多大的空間需要在編譯時確定,便於作業系統為程式分配適當的記憶體空間。從靜態儲存區分配 程式的全域性變數和靜態變數都在這裡分配,且在編譯時已經分配好,在程式終止前被作業系統 在棧上建立 在函式呼叫時,函式的形參和區域性變數都在棧上建立,函式執行完畢時這些記...

C語言記憶體分布

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