一、二維數據的內存空間動態分配
方法一:
void malloc2D_1(int **&a)
{
a = new int*[xDim];
for(int i=0;i<xDim;i++)
a[i] = new int[yDim];
assert(a!=NULL);
}
int main()
{
int **arr = NULL;
malloc2D_1(arr);
}
void malloc2D_1(int **&a)
{
a = new int*[xDim];
for(int i=0;i<xDim;i++)
a[i] = new int[yDim];
assert(a!=NULL);
}
int main()
{
int **arr = NULL;
malloc2D_1(arr);
}
首先arr是一個二級指針,爲arr分配xDim空間,每一維都是一個指向數組的指針,且每個數組內部的地址空間是連續的,但是數組之間的地址空間沒有連續性。這種分配方法在內存中的佈局如下:
方法二:
void malloc2D_2(int **&a)
{
a = (int **)malloc( xDim * sizeof(int *) );
a[0] = (int *)malloc( xDim * yDim * sizeof(int) );
for(int i=1;i<xDim;i++)
{
a[i] = a[i-1] + yDim;
}
assert(a!=NULL);
}
int main()
{
int **arr = NULL;
malloc2D_2(arr);
}
void malloc2D_2(int **&a)
{
a = (int **)malloc( xDim * sizeof(int *) );
a[0] = (int *)malloc( xDim * yDim * sizeof(int) );
for(int i=1;i<xDim;i++)
{
a[i] = a[i-1] + yDim;
}
assert(a!=NULL);
}
int main()
{
int **arr = NULL;
malloc2D_2(arr);
}
這種方法相當於動態分配了一個一維的連續的空間,然後讓相應的數組指針指向某些固定的位置達到調用的目的。
這種分配方法在內存中的佈局如下:
二、二維數據的內存空間釋放
對於第一種分配方式需要一個一個釋放,對第二種方式只要分配兩個指針即可。
void free2D_1(int **a)
{
for(int i=0;i<xDim;i++)
free(a[i]);
}
void free2D_2(int **a)
{
free(a[0]);
free(a);
}
void free2D_1(int **a)
{
for(int i=0;i<xDim;i++)
free(a[i]);
}
void free2D_2(int **a)
{
free(a[0]);
free(a);
}
三、完整代碼
#include<iostream>
using namespace std;
const int xDim = 10;
const int yDim = 8;
//分配空間方式一
void malloc2D_1(int **&a)
{
a = new int*[xDim];
for(int i=0;i<xDim;i++)
a[i] = new int[yDim];
assert(a!=NULL);
}
//分配空間方式二
void malloc2D_2(int **&a)
{
a = (int **)malloc( xDim * sizeof(int *) );
a[0] = (int *)malloc( xDim * yDim * sizeof(int) );
for(int i=1;i<xDim;i++)
{
a[i] = a[i-1] + yDim;
}
assert(a!=NULL);
}
void assign_value(int **a,int val)
{
for(int i=0;i<xDim;i++)
{
for(int j=0;j<yDim;j++)
{
a[i][j] = val;
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
}
//釋放空間方式一
void free2D_1(int **a)
{
for(int i=0;i<xDim;i++)
free(a[i]);
}
//釋放空間方式二
void free2D_2(int **a)
{
free(a[0]);
free(a);
}
int main()
{
int **arr1 = NULL;
int **arr2 = NULL;
malloc2D_1(arr1);
malloc2D_2(arr2);
assign_value(arr1,1);
assign_value(arr2,2);
free2D_1(arr1);
free2D_2(arr2);
system("pause");
return 0;
}