c程式記憶體結構
乙個32位的執行在保護模式下應用程式 無論是linux 還是windows 都給它分配乙個4gb的平坦的記憶體空間
乙個執行著的c程式所占用的記憶體空間分為:
**區 初始化資料區 未初始化資料區 堆區 和 棧區 在位址上從高位到地位為
(高位)
棧區堆區
未初始化資料區(即bbs)
資料區**區
(低位)
棧區存放函式的引數值、區域性變數的值 ,
由編譯器自動分配釋放
比如實現函式的遞迴呼叫
堆區用於動態分配記憶體
一般由程式設計師來分配釋放
下面用一斷**來展示c程式記憶體分配
int a = 0; //a是全域性變數 在已初始化區
char *p1; //p1在bbs區(未初始化資料區)
main()
c程式一直由下面幾部分組成:
(1) 棧
由編譯器自動分配釋放管理。區域性變數及每次函式呼叫時返回位址、以及呼叫者的環境資訊(例如某些機器暫存器)都存放在棧中。新被呼叫的函式在棧上為其自動和臨時變數分配儲存空間。通過以這種方式使用棧,c函式可以遞迴呼叫。遞迴函式每次呼叫自身時,就使用乙個新的棧幀,因此乙個函式呼叫例項中的變數集不會影響另乙個函式呼叫例項中的變數。
a.區域性變數
b.函式呼叫時返回位址
c.呼叫者的環境資訊(例如某些機器暫存器)
(2) 堆
需要由程式設計師分配釋放管理,若程式設計師不釋放,程式結束時可能由os**。通常在堆中進行動態儲存分配。
如程式中的malloc, calloc, realloc等函式都從這裡面分配。堆是從下向上分配的。
(3) 非初始化資料段
通常將此段稱為bss段,這一名稱**於早期匯程式設計序的乙個操作符,意思是「block started by symbol(由符號開始的塊)」,未初始化的全域性變數和靜態變數存放在這裡。在程式開始執行之前,核心將此段初始化為0。函式外的說明:long sum[1000] ; 使此變數存放在非初始化資料段中。
a.未初始化的全域性變數
b.未初始化的靜態變數
(4) 初始化的資料
通常將此段稱為資料段,它包含了程式中需賦初值的變數。初始化的全域性變數和靜態變數存放在這裡。例如,c程式中任何函式之外的說明:int maxcount = 99; 使此變數以初值存放在初始化資料段中。
a.初始化的全域性變數
b.初始化的靜態變數
(5) 正文段
cpu執行的機器指令部分。通常,正文段是可共享的,所以即使是經常環境指標環境表環境字串執行的程式(如文字編輯程式、c編譯程式、s h e l l等)在儲存器中也只需有乙個副本,另外,正文段常常是唯讀的,以防止程式由於意外事故而修改其自身的指令。
下面的記憶體結構顯示了這些段的典型安排:
下面給出一般的c程式儲存布局的典型安排:
使用者空間的程式使用低2g的虛擬記憶體,核心空間使用高2g
高位址 ——0x7fffffff———
命令列引數和環境變數
——————————
棧空間,向下增長
___________________
堆空間,向上增長
———————————
未初始化的資料
———————————
已初始化的資料
———————————
正文段低位址—0x00000000————
可以注意到未初始化的資料段的內容並不放在磁碟上的程式檔案中,因為,在程式開始執行前他們都被設定為0。需要存放在程式檔案中的只有正文段和初始化資料段。
參考:unix環境高階程式設計第二版p152
C 程式記憶體結構
標籤 空格分隔 c 記憶體 棧區 stack 又編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。堆區 heap 一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。未初...
C 程式的記憶體結構
問題引出 在看一些資料部落格的時候說執行緒共享同乙個程序的 段和資料段,又有說法是 段和資料段在可執行檔案中載入,比較疑惑,下面稍微具體的整理一下。int a 0 全域性初始化區 char p1 全域性未初始化區 main int b 棧 char s abc 棧 char p2 棧 char p3...
C 程式的記憶體結構
問題引出 在看一些資料部落格的時候說執行緒共享同乙個程序的 段和資料段,又有說法是 段和資料段在可執行檔案中載入,比較疑惑,下面稍微具體的整理一下。int a 0 全域性初始化區 char p1 全域性未初始化區 main int b 棧 char s abc 棧 char p2 棧 char p3...