堆疊區別變數布局

2021-06-21 00:25:50 字數 895 閱讀 4613

每個程序看到得虛擬位址空間有大量準確定義的區(area)構成,每個區都有專門的功能。

**段和資料段:對於所有程序,**是從同一固定位址開始,緊接著的是和c全域性變數相對應的資料區。**段和資料段是直接按照可執行目標檔案的內容初始化的。(.txt--存放的是二進位制的機器指令碼、.data--初始化的全域性變數、初始化的靜態變數)

bss段:存放的是未初始化的全域性變數和未初始化的靜態變數(全是0)。

堆:**和資料區後緊隨著的是執行時堆。作為呼叫malloc和free這樣的c標準庫函式,堆可以在執行時動態的擴充套件和收縮。堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。首先作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式;對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣,**中的delete語句才能正確的釋放本記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。潛在問題:記憶體洩露、記憶體碎片、記憶體崩潰。

棧:位於使用者虛擬位址空間頂部的是使用者棧,存放函式的引數值,區域性變數的值等,編譯器用它來實現函式呼叫。棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。我們從函式返回時,棧就會收縮。(1mb到2mb)只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。

核心虛擬儲存器:核心是作業系統總是駐留在儲存器中的部分。位址空間頂部的四分之一部分是為核心預留的。不允許應用程式讀寫該區域內容或直接呼叫核心函式。

C 記憶體布局 變數在堆疊的分配

1.變數的記憶體分布 const變數儲存在.rodata read only 區域 char p abcd p指向的是靜態文字區域.text rodata 和 text 被合併為乙個segment,由os保護起來,只可讀。register變數存放在.bss區域 區域性變數存放在棧空間,static變...

堆,棧,堆疊的區別

乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀,data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫 就是通常所說的靜態儲存區,賦了初值的全域性變數和靜態變數存放在這個區域,常量也存放在這個區域 bss段 定義而沒有賦初值的全域性變數...

佇列 堆 棧 堆疊的區別?

佇列是先進先出 就像一條路,有乙個入口和乙個出口,先進去的就可以先出去。而棧就像乙個箱子,後放的在上邊,所以後進先出。程序中每個執行緒都有自己的堆疊,這是一段執行緒建立時保留下的位址區域。我們的 棧記憶體 即在此。至於 堆 記憶體,我個人認為在未用new定義時,堆應該就是未 保留 未 提交 的自由空...