C++中二维数组的两种动态内存分配方法

来源:互联网 发布:网络电视怎么看爱奇艺 编辑:程序博客网 时间:2024/05/16 13:38

转载自http://blog.csdn.net/lavorange/article/details/42879605

一、二维数据的内存空间动态分配

方法一:

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 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;  }