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

C/C++/Golang 专栏收录该内容
11 篇文章 0 订阅

最近在看一个程序的源代码的时候了解到了二维数组的动态分配空间以及释放的方法,在此记录。

 

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

方法一:

 

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

 

 

 

 

Author:忆之独秀

Email:leaguenew@qq.com

注明出处:http://blog.csdn.net/lavorange/article/details/42879605

 

 

 

  • 20
    点赞
  • 8
    评论
  • 38
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值