當我們定義一個二維指針時,如果需要存儲相應的數據,就需要我們動態的分配內存,這時,有一點是需 要注意的,分配內存的方法不同,內存的連續性也是不相同的,首先,博主先貼出測試代碼:
#include <cstdlib> #include <iostream> using namespace std; #define nWidth 3 #define nHeight 4 //內存是否連續分配問題 int main(int argc, char *argv[]) { int **p = NULL; p = (int**)malloc(nWidth*sizeof(int*)); if(p == NULL) return -1; cout<<"內存的不連續分配:"<<endl; for(int j = 0; j< nWidth; j++) { p[j] = (int*)malloc(nHeight*sizeof(int)); if(p[j] == NULL) return -1; } for(int i = 0; i < nWidth; i++) for(int j = 0; j < nHeight; j++) { printf("%p ",&p[i][j]); if(j == nHeight-1) cout<<endl; } cout<<endl; for(int j = 0; j < nWidth; j++) { free(p[j]); p[j] = NULL; } free(p); p = NULL; int **q = NULL; q = (int**)malloc(nWidth*sizeof(int*)); if(q == NULL) return -1; cout<<"內存的連續分配:"<<endl; q[0] = (int*)malloc(nWidth*nHeight*sizeof(int)); if(q[0] == NULL) { free(q); return -1; } for(int i = 1;i < nWidth; i++) q[i] = q[i-1] + nHeight; for(int i = 0; i < nWidth; i++) for(int j = 0; j < nHeight; j++) { printf("%p ",&q[i][j]); if(j == nHeight-1) cout<<endl; } cout<<endl; free(q[0]); q[0] = NULL; free(q); q = NULL; system("PAUSE"); return EXIT_SUCCESS; }
運行截圖如下:
如圖所示,兩種分配內存的方法都能正確的分配內存,但是內存分配的空間確實不一樣的。
分析:
第一種分配方法:
首先,是對每一行分配,也就是 nWidth 中的每一個進行分配,所以,我們 可以看到每一行的內存都是連續的,每一個都占據四個字節
但是,為nHeight分配內存的時候,是隨機 的進行分配內存,所以內存的位置是不確定的,所以,出現了第一種情況
第二種分配方法:
首 先,同樣是為 p 分配內存,現在 p 指向一個位置
但是,在第二句中,我們需要注意,是直接在 p[0] 出分配了所有需要的內存,所以,這個時候就全部分配完了,而且由於是一次性分配內存,故內存的地址肯定 是連續的,運行結果也證明了這一點
釋放內存的兩種情況:
第一種情況由於是兩次不同的分配 內存,所以,在釋放內存的時候,我們應選擇不同的區域進行釋放。
第二種情況,只是連續調用兩次 malloc ,所以,只需要連續兩次調用 free 即可完成釋放。