1. 每次都會遇到這個問題,一直是看了又忘,忘了又看。本文主要簡介一下程式設計c語言中的記憶體型別和布局問題。
2. 記憶體的型別
(1)棧區(stack):由編譯器自動分配和釋放的,存放函式的引數值、區域性變數的值等。操作方式類似資料結構中的棧。
在函式引數和位址入棧情況中,一般是從左向右將變數入棧,最後函式的位址入棧。
(2)堆區(heap):由程式設計師手動分配和釋放,完全不同於資料結構中的堆,分配方式類似鍊錶。即由malloc或new來分配,free和delete釋放。
(3)全域性區(靜態區):全域性變數和靜態變數的記憶體是儲存放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,
程式設計師結束後由系統釋放。
(4)文字常量區:常量字串放在這裡。程式結束時系統釋放。
(5)程式**區:存放函式體的二進位制**。
下面是一段程式**,具體說明:
int a = 0; //存放在全域性初始化區
char *p1; //存放在全域性未初始化區
int main()
3 記憶體空間分配
對乙個程序的記憶體空間分配,主要是**區,靜態資料區和動態資料區。c語言中有全域性變數,本地變數,靜態變數和暫存器變數。
靜態資料區包括了全域性變數和靜態變數。動態資料區包括了堆,棧(堆疊)資料內容,編譯的二進位制**就放在**區。
├———————┤低端記憶體區域
│ …… │
├———————┤
│ 動態資料區 │
├———————┤
│ …… │
├———————┤
│ **區 │
├———————┤
│ 靜態資料區 │
├———————┤
│ …… │
├———————┤高階記憶體區域
3. 記憶體洩露問題
vc6.0裡面的一種簡單的檢測記憶體洩露的方法。首先包含了下面的標頭檔案
#define _crtdbg_map_alloc
#include
#include
注意:#include 語句的順序。如果更改此順序,所使用的函式可能無法正確工作。
然後在需要檢測記憶體洩露的地方加入_crtdumpmemoryleaks();語句即可。
除錯時使用debug模式來呼叫,即會在輸出資訊的視窗出現相關記憶體資訊。
更多了解**:
C語言中記憶體對齊問題
在日常的開發工作中,時常要用到結構體的定義工作,但是結構體中資料的定義順序是否合理直接影響了結構體所佔記憶體的大小,所以了解c語言中記憶體對齊的知識十分有必要。關於記憶體對齊的原則,我們首先討論沒有定義巨集 pragam pack 的情況,在該巨集沒有定義的情況之下,c語言中結構體的記憶體對齊問題主...
C語言中記憶體分配問題
推薦 c語言中記憶體分配 linux size命令和c程式的儲存空間布局 本大神感覺,上面的鏈結的內容,已經很好的說明了 對於乙個可執行檔案,在linux下可以使用 size命令列出目標檔案各部分佔的位元組數 分為 text段 data段與bss段 參考 linux size命令和c程式的儲存空間布...
c語言中記憶體對齊問題
一 記憶體對齊的原因 大部分的參考資料都是如是說的 1 平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料的 某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。2 效能原因 資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需...