c語言中記憶體佈局問題
1. 每次都會遇到這個問題,一直是看了又忘,忘了又看。本文主要簡介一下程式設計c語言中的記憶體型別和佈局問題。
2. 記憶體的型別
(1)棧區(stack):由編譯器自動分配和釋放的,存放函式的引數值、區域性變數的值等。操作方式類似資料結構中的棧。
在函式引數和地址入棧情況中,一般是從左向右將變數入棧,最後函式的地址入棧。
(2)堆區(heap):由程式設計師手動分配和釋放,完全不同於資料結構中的堆,分配方式類似連結串列。即由malloc或new來分配,free和delete釋放。
(3)全域性區(靜態區):全域性變數和靜態變數的記憶體是儲存放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域,
程式設計師結束後由系統釋放。
(4)文字常量區:常量字串放在這裡。程式結束時系統釋放。
(5)程式程式碼區:存放函式體的二進位制程式碼。
下面是一段程式程式碼,具體說明:
int a = 0; //存放在全域性初始化區
char *p1; //存放在全域性未初始化區
int main()
{
int b; //存放於堆疊中,即棧中。
char s[] = "abc"; //存放於堆疊中, 即棧中。
char *p2; //存放於堆疊中,即棧中。
char *p3 = "123456"; //p3本身是存放在堆疊中,"123456"是存放在常量區中
static int c = 0; //存放在全域性初始化區
p1 = (char*)malloc(10); //存放在堆中,由程式設計師手動釋放。
p2 = (char*)malloc(20); //存放在堆中
strcpy(p1, "123456");
//"123456"在常量區。編譯器可能會將它與p3所指向的"123456"優化成一個地方。
free(p1);
free(p2);
}
3 記憶體空間分配
對一個程序的記憶體空間分配,主要是程式碼區,靜態資料區和動態資料區。c語言中有全域性變數,本地變數,靜態變數和暫存器變數。
靜態資料區包括了全域性變數和靜態變數。動態資料區包括了堆,棧(堆疊)資料內容,編譯的二進位制程式碼就放在程式碼區。
├———————┤低端記憶體區域
│ …… │
├———————┤
│ 動態資料區 │
├———————┤
│ …… │
├———————┤
│ 程式碼區 │
├———————┤
│ 靜態資料區 │
├———————┤
│ …… │
├———————┤高階記憶體區域
3. 記憶體洩露問題
vc6.0裡面的一種簡單的檢測記憶體洩露的方法。首先包含了下面的標頭檔案
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
注意:#include 語句的順序。如果更改此順序,所使用的函式可能無法正確工作。
然後在需要檢測記憶體洩露的地方加入_CrtDumpMemoryLeaks();語句即可。
除錯時使用Debug模式來呼叫,即會在輸出資訊的窗口出現相關記憶體資訊。
更多瞭解轉自: