當我們定義一個二維指標時,如果需要儲存相應的資料,就需要我們動態分配記憶體,這時,有一點是需要注意的,分配記憶體的方法不同,記憶體的連續性也是不相同的
首先,小編先貼出測試代碼:
複製代碼 代碼如下:
#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 即可完成釋放。