二維指針靜態分派內存持續成績深刻剖析。本站提示廣大學習愛好者:(二維指針靜態分派內存持續成績深刻剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是二維指針靜態分派內存持續成績深刻剖析正文
起首,小編先貼出測試代碼:
#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 便可完成釋放。