C CPP程序記憶體空間分布

2022-06-21 08:48:12 字數 1315 閱讀 8810

記憶體分布分為5個部分,從高位址到低位址依次為棧區(stack),堆區(heap),未初始化資料段(uninitialized data),初始化資料段(initialize data)和**段(text)。

有些文件也把初始化的資料段和未初始化的資料段合稱全域性區。

1. 文字段--唯讀、共享,作業系統管理

文字段也叫**段,是物件檔案或記憶體中程式的一部分,其中包含可執行指令。文字段在堆疊的下面,是防止堆疊溢位覆蓋它。

通常**段是共享的,對於經常執行的程式,只有乙個副本需要儲存在記憶體中;**段是唯讀的,以防止程式以外修改指令。

2. 初始化的資料段

通常稱為資料段,是程式的虛擬位址空間的一部分,它包含程式設計師初始化的全域性變數和靜態變數以及常量,可以進一步劃分為唯讀區域和讀寫區域。

例如,c中的char=「hello world」的全域性字串,以及main(例如全域性)之外的int debug=1這樣的c語句,將被儲存在初始的讀寫區域中。

而像const char字串=「hello world」這樣的全域性c語句常量字串文字「hello world」被儲存在初始化的唯讀區域中,並在初始化的讀寫區域中儲存字元指標變數字串。

3. 未初始化的資料段--核心初始化為0

通常稱為bss段,這個段的資料在程式開始之前有核心初始化為0,包含所有初始化為0和沒有顯示初始化的全域性變數和靜態變數。

這個段在程式開始之前由核心初始化為全0,所以不在可執行檔案中占用位置,可減少可執行檔案體積。

4. 堆--程式設計師管理

堆是動態記憶體分配通常發生的部分。記憶體分配由低到高,分配方式類似於資料結構的鍊錶。堆區域從bss段的末尾開始,並從那裡逐漸增加到更大的位址。

堆是由程式設計師自己分配的,或程式結束後由作業系統自動**。堆區域由所有共享庫和程序中動態載入的模組共享。(malloc和new從堆區分配記憶體)

5. 棧--編譯器分配管理

存放自動變數,以及函式呼叫時儲存的資訊。每當進行函式呼叫時,函式的實參和返回位址以及呼叫者的上下文環境會被存放在棧中;棧區由編譯器自動分配,從高位址向低位址擴充套件。

在函式呼叫時,第乙個進棧的是主函式中後的下一條指令(函式呼叫語句的下一條可執行語句)的位址,然後是函式的各個引數,在大多數的c

編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。

當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的位址,也就是主函式中的下一條指令,程式由該點繼續執行。

不同區域存放的資料,賦予不同的生命週期,給程式設計更大的靈活性。

c 程序記憶體空間分布

c 程序記憶體空間分布 注意各部分的記憶體位址誰高誰低,注意棧從高到低分配,堆從低到高分配 記憶體分布分為5個部分,從高位址到低位址一次為 棧區 stack 堆區 heap 未初始化資料段 uninitialized data 初始化資料段 initialize data 段 text 1.文字段也...

記憶體空間分布

code或.text,段 用來存放可執行的機器指令的一塊記憶體區域,這部分區域的 屬於唯讀。字串常量也在也在 段上。data,資料段 用來存放程式中已初始化的全域性變數的一塊記憶體區域,例如已初始化的全域性變數和區域性靜態變數 初始化為非0 bss 用來存放程式中未初始化的全域性變數的一塊記憶體區域...

C 記憶體空間分布

1.stack,即棧區,存放自動變數,以及函式呼叫時儲存的資訊。每當進行函式呼叫時,函式的實參和返回位址以及呼叫者的上下文環境會被存放在棧中 棧區由編譯器自動分配,從高位址向低位址擴充套件,為什麼會這樣?我也不知道 2.heap,即堆區,動態記憶體分配都是發生在堆區,堆區由程式設計師分配釋放,或程式...