1.一维数组内存的动态分配和释放如下:
int *array=new int [10]; //动态分配(例如分配10个单元的)
memset(array,0,sizeof(array)); //初始化 (也可以利用一个for循环对其赋值初始化)
delete [] array; //撤销
2.二维数组m行n列)利用new来进行动态分配实际上相当于对m个n元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来这项操作。
具体做法如下:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
array[i]=new int [5];
}
上面的操作完成了一个10行5列的二维数组array[10][5]的动态分配,可以看到我们先动态分配了一个10单元的数组的指针的指针的首地址给array,然后再对其每个首地址进行遍历,同时完成一个5单元的数组的动态分分配,并把首地址给array[i],从而最终完成了二维数组array[10][5]的动态分配。
3.二维数组的初始化
MSDN对memset的描述如下:
memset
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。具体写法如下:
int **array;
array=new int *[10];
for(int i=0;i<10;i++)
{
array[i]=new int [5];
memset(array[i],0,5*sizeof(int));
}
4.二维数组内存的释放
for (int i = 0; i < 10; i++)
{
delete[5]array[i];
}
delete[]array;
5.完整的例子
int x = 3, y = 4;
int **p = new int*[x];//创建一个动态 int* 型数组
for (int i = 0; i < y; ++i)
p[i] = new int [x]; //再创建一个动态 int 型数组
for (int i = 0; i < y; ++i)
{
delete [] p[i];//由里至外,进行释放内存。
p[i] = NULL;//不要忘记,释放空间后p[i]不会自动指向NULL值,还将守在原处,只是释 放内存而已,仅此而已。
}
delete []p;
p = NULL;
6.一些错误的例子
int (*p)[4] = new int[3][4]; //错误!
int *p = new int[4][2]; //错误!
int x = 3, y = 4;
int (*p)[y] = new int[x][y];
//错误,y必须是const。所以这种方式不能达到真正的动态分配二维数组的目的,只能相当于半自动化的一个分配方式。