c 程序記憶體空間分布

2021-08-22 08:24:35 字數 994 閱讀 7645

c++程序記憶體空間分布(注意各部分的記憶體位址誰高誰低,注意棧從高到低分配,堆從低到高分配)

記憶體分布分為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.為初始化的資料段,通常稱為bss段,這個段的資料在程式開始之前有核心初始化為0,包含所有初始化為0和沒有顯示初始化的全域性變數和靜態變數,

4.堆  堆是動態記憶體分配通常發生的部分。記憶體分配由低到高,分配方式類似於資料結構的鍊錶。堆區域從bss段的末尾開始,並從那裡逐漸增加到更大的位址。堆是由程式設計師自己分配的。堆區域由所有共享庫和程序中動態載入的模組共享。(malloc和new從堆區分配記憶體)

5.棧  存放自動變數,以及每次呼叫函式時儲存的資訊。每當呼叫乙個函式時,返回到的位址和關於呼叫者環境的某些資訊的位址,比如一些機器暫存器,就會被儲存在棧中。然後,新呼叫的函式在棧上分配空間,用於自動和臨時變數。(直接定義陣列是從棧中分配)

C CPP程序記憶體空間分布

記憶體分布分為5個部分,從高位址到低位址依次為棧區 stack 堆區 heap 未初始化資料段 uninitialized data 初始化資料段 initialize data 和 段 text 有些文件也把初始化的資料段和未初始化的資料段合稱全域性區。1.文字段 唯讀 共享,作業系統管理 文字段...

C 記憶體空間分布

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

記憶體空間分布

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