在c/c++執行時將資料分為四個區域:堆區、棧區、**區和資料區。
一般記憶體的分類分為:棧區、堆區、全域性區(靜態區)(存放全域性變數與靜態變數static)、bss段、文字常量區、資料區、**區等。
用於動態記憶體分配。堆在記憶體中位於bss區和棧區之間。一般由程式設計師分配和釋放,若程式設計師不釋放,程式結束時有可能由os**。堆(heap): 堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc 等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free 等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)。在將應用程式載入到記憶體空間執行時,作業系統負責**段、資料段和bss段的載入,並將在記憶體中為這些段分配空間。棧段亦由作業系統分配和管理,而不需要程式設計師顯示地管理;堆段由程式設計師自己管理,即顯式地申請和釋放空間。
由編譯器自動分配釋放,存放函式的引數值、區域性變數的值等。存放函式的引數值、區域性變數的值,以及在進行任務切換時存放當前任務的上下文內容。其操作方式類似於資料結構中的棧。每當乙個函式被呼叫,該函式返回位址和一些關於呼叫的資訊,比如某些暫存器的內容,被儲存到棧區。然後這個被呼叫的函式再為它的自動變數和臨時變數在棧區上分配空間,這就是c實現函式遞迴呼叫的方法。每執行一次遞迴函式呼叫,乙個新的棧框架就會被使用,這樣這個新例項棧裡的變數就不會和該函式的另乙個例項棧裡面的變數混淆。棧(stack) :棧又稱堆疊, 是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧"{}"中定義的變數(但不包括static 宣告的變數,static 意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/ 恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。
**區指令根據程式設計流程依次執行,對於順序指令,則只會執行一次(每個程序),如果反覆,則需要使用跳轉指令,如果進行遞迴,則需要借助棧來實現。**段: **段(code segment/text segment )通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀, 某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。**區的指令中包括操作碼和要操作的物件(或物件位址引用)。如果是立即數(即具體的數值,如5),將直接包含在**中;如果是區域性資料,將在棧區分配空間,然後引用該資料位址;如果是bss區和資料區,在**中同樣將引用該資料位址。另外,**段還規劃了區域性資料所申請的記憶體空間資訊。
全域性初始化資料區/靜態資料區(data segment)。只初始化一次。資料段: 資料段(data segment )通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。data段中的靜態資料區存放的是程式中已初始化的全域性變數、靜態變數和常量。
未初始化資料區(bss)。在執行時改變其值。bss 段: bss 段(bss segment )通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss 是英文block started by symbol 的簡稱。bss 段屬於靜態記憶體分配,即程式一開始就將其清零了。一般在初始化時bss段部分將會清零。
# include
# include
# include
int num1;
/*bss段*/
int num2 =20;
/*全域性區*/
char
* str1 =
"str1"
;/*文字常量區*/
intmain
(void
)/*死迴圈以保證程序不會結束,方便檢視/proc/pid/maps檔案*/
free
(p);
return0;
}
C語言記憶體模型
bss段 bss segment 通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。資料段 data segment 通常是指用來存放程式中 已初始化 的 全域性變數 的一塊記憶體區域。資料段屬於...
c語言記憶體模型
文章一 c語言的記憶體分配模型 1 程式 區 存放函式體的二進位制 2 全域性區資料區 全域性資料區劃分為三個區域。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。常量資料存放在另乙個區域裡。這些資料在程式結...
c語言記憶體模型
文章一 c語言的記憶體分配模型 1 程式 區 存放函式體的二進位制 2 全域性區資料區 全域性資料區劃分為三個區域。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。常量資料存放在另乙個區域裡。這些資料在程式結...