程序內存佈局

程序虛擬地址佈局:

從高到低:
0X8000,0000 - 0XFFFF,FFFF  內核空間
0X7FFF,0000 - 0X7FFF,FFFF   64K的禁止進入區
0X0001,0000 - 0X7FFE,FFFF  用戶空間
0X0000,0000 - 0X0000,FFFF  NULL指針分配區(64K)

其中用戶空間中,用戶的exe程序一般加載到0X0040,0000(往高處加載),
而主線程(main/WinMain線程)的棧空間是 : 0X0003,0000 - 0X0013,0000,而且棧空間是從高位到低位分配使用,
所以如果測試下面代碼:


其打印結果是:
0012,FF74
0012,FF78
0012,FF70
而且每次保持不變

而堆空間則從低往高分配,其中new最終調用 HeapAlloc(_crtheap, 0, size ? size : 1); 實現分配
在debug模式下 _crtheap = 0x003e,0000,也就是堆空間從 0X003E,0000 - 0X7FFE,0000
當然在堆空間中會有dll的加載,線程的棧空間等等,堆分配時會跳過這些被使用的空間

當創建一個線程時,其線程的棧空間其實也是通過HeapAlloc開在堆上的,所以線程的棧空間地址不固定。


發佈了59 篇原創文章 · 獲贊 9 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章