【原文】http://blog.csdn.net/shanzhizi/article/details/7835752
数组的动态分配、初始化和释放经常用到,这里总结一下,尤其是二维数组
一维数组
一维数组的动态分配,初始化和撤销都好说,几乎每一本C++教材都会做出详细的说明。具体如下:
动态分配: int *array=new int [n];
初始化:memset(array,0,n*sizeof(array)); (也可以利用一个for循环对其赋值初始化)
撤销:delete [] array;
动态分配: int *array=new int [n];
初始化:memset(array,0,n*sizeof(array)); (也可以利用一个for循环对其赋值初始化)
撤销:delete [] array;
动态分配:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来进行这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
二维数组(n行m列)利用new来进行动态分配实际上相当于对n个m元数组进行动态分配,只不过我们不能一味的按照动态分配一维数组的方法来进行这项操作。MSVC目前还没有这般的人性化,具体应该这样做:
- int **array;
- array=new int *[10];
- for(int i=0;i<10;i++)
- array[i]=new int [5];
初始化:
如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。这就要理解到memset这个函数三个参数的含义。MSDNhttp://blog.csdn.net/shanzhizi对memset的描述如下:
如果把一维数组初始化办法照搬过来就会发现对于动态分配的二维数组并不适用。这就要理解到memset这个函数三个参数的含义。MSDNhttp://blog.csdn.net/shanzhizi对memset的描述如下:
Sets buffers to a specified character.
void *memset( void *dest, int c, size_t count );
void *memset( void *dest, int c, size_t count );
可见memset只能作用于一个一维数组void *dest,因此最好的办法就是和二维数组的动态分配结合起来,new一个,memset一个。我的理解是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)); //注意这里是array[i]
- }
撤销:
- #include <stdio.h>
- #include <memory.h>
- #define size1 5
- #define size2 10
- #define size3 15
- int main()
- {
- int *** arr;
- int i,j,k;
- /////////////////// 动态开辟 相当于arr[size1][size2][size3]
- arr = new int**[size1];
- for (i = 0; i < size1; i ++) {
- arr[i] = new int*[size2];
- for (j = 0; j < size2; j ++) {
- arr[i][j] = new int[size3];
- }
- }
- /////////////////// 用for循环初始化
- for (i = 0; i < size1; i ++) {
- for (j = 0; j < size2; j ++) {
- for (k = 0; k < size3; k ++) {
- arr[i][j][k] = i * j * k;
- }
- }
- }
- for (i = 0; i < size1; i ++) {
- for (j = 0; j < size2; j ++) {
- for (k = 0; k < size3; k ++) {
- printf("i*j*k=%d*%d*%d=%d/n",i,j,k,arr[i][j][k]);
- }
- }
- }
- /////////////////// 用memset,如果是静态int arr[][][]的话,直接memset(arr,0,sizeof(arr));数组初始化为0
- for (i = 0; i < size1; i ++) {
- for (j = 0; j < size2; j ++) {
- memset(arr[i][j],-1,sizeof(int) * size3);
- }
- }
- for (i = 0; i < size1; i ++) {
- for (j = 0; j < size2; j ++) {
- for (k = 0; k < size3; k ++) {
- printf("i,j,k=%d,%d,%d=%d/n",i,j,k,arr[i][j][k]);
- }
- }
- }
- ///////////////////// 释放内存
- for (i = 0; i < size1; i ++) {
- for (j = 0; j < size2; j ++) {
- delete[] arr[i][j];
- }
- delete[] arr[i];
- }
- delete[] arr;
- return 0;
- }