1. 程式人生 > >c語言中記憶體佈局問題

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模式來呼叫,即會在輸出資訊的窗口出現相關記憶體資訊。
      更多瞭解轉自:

http://pcedu.pconline.com.cn/empolder/gj/vc/0506/648575.html