C程式 程序記憶體結構分析

2021-09-06 14:43:23 字數 1759 閱讀 2566

1. 每個程序都執行在自己私有的記憶體空間中(即虛擬位址空間)。在32位系統中,4gb的程序位址東健被分為使用者空間和核心空間兩個部分。使用者空間佔據著0~3gb(用16進製表示為0xc0000000),而核心空間的範圍是3gb~4gb。對於乙個程序而言,都會涉及3種不同的資料段,分別是**段、資料段和堆疊段。

**段:用於儲存可執行檔案的操作指令和程式定義的常量。為了防止**在執行的時候被其他程序修改,**段將只允許讀取,不能進行修改。多程序能夠共享相同的**段,即當程式被多次執行時,執行的相同程式將共享**段。

資料段:其位置緊接著**段,分為初始化資料段和未初始化資料段(也稱為bss段)。初始化**段用於存放已經初始化的全域性變數和程式的靜態變數,而未初始化資料段用於儲存未初始化的全域性變數。

堆疊段:堆疊段的堆用於存放程序中動態分配的記憶體位址。例如,在c語言中使用malloc函式、在c++中使用new函式分配的記憶體空間都將在堆中分配。當使用free函式或delete函式釋放記憶體時,分配的記憶體將從堆中刪除。棧用於儲存程式中建立的臨時變數。函式呼叫時,傳遞的引數也將被儲存在棧中。在函式呼叫結束後,其返回值也將儲存在棧中。棧具有先進先出的特點,適用於儲存和恢復現場。可以將棧看作用於存放臨時資料、進行資料交換的記憶體區域。棧的大小受作業系統的限制,因此從棧中獲得的空間大小有限,而堆的大小只是受限於虛擬記憶體空間,因此使用堆可以獲得較大的記憶體空間。堆的位置與資料段相鄰。

2. **

1 #include 2 #include 3 #include 45

6int etext,edata,end;//78

//g_pstr和g_buffer都為全域性變數,只是乙個初始化,乙個未初始化

9char *g_pstr="

global string\n";

10char g_buffer[20

];11

12 inline void disp_addr(char * p,int

addr)

1316

17void disp_var(char*p)

1826

27int

main()

28

3. 執行結果

addr etext :0x8049954

addr edata :

0x8049958

addr end :

0x8049950

name : function main() :,address :804850c

name :function disp_var():,address :80484a7

name : g_pstr address :,address :

8049930

name : g_buffer address :,address :804993c

name : i address :,address :bf8583ec

name :buffer1 address:,address :bf8583bc

buffer1 : global

string

4. 圖示

5.使用者空間到0xc0000000-0xbfb18cac = 棧的大小  

在vc或vs中好像是使用 #pragma comment(linker, "/stack:1024000000,1024000000")

至於linux 下就不太清楚了

出處:

C程式記憶體結構

c程式記憶體結構 乙個32位的執行在保護模式下應用程式 無論是linux 還是windows 都給它分配乙個4gb的平坦的記憶體空間 乙個執行著的c程式所占用的記憶體空間分為 區 初始化資料區 未初始化資料區 堆區 和 棧區 在位址上從高位到地位為 高位 棧區堆區 未初始化資料區 即bbs 資料區 ...

C 程式記憶體結構

標籤 空格分隔 c 記憶體 棧區 stack 又編譯器自動分配釋放,存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構的棧。堆區 heap 一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。未初...

C 類記憶體結構分析

本文的目標是闡述清楚 c 的類相關的記憶體結構問題。這個問題對於已經很了解的人來說,太簡單了,這還有必要拿出來與人分享嗎?但對於那些不了解的人,始終有一層窗戶紙不能被捅破,似乎總是不能非常到位的理解本質。本文的闡述過程會分為幾個階段,類與物件的關係,物件到底是什麼,類的函式時如何被處理的,多型是如何...