動態開闢二維數組

一、二維數據的內存空間動態分配

方法一:

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;  
}  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章