我知道動態分配/取消分配二維數組的算法,但我對三維數組的相同性不太確定。
利用這些知識和一些對稱性,我想出了下面的代碼。
(在編碼過程中,我很難在3D中進行可視化)。2D和3D數組的動態分配/取消分配
請評論正確性,並建議任何更好的選擇(效率明智或直觀),如果有的話。
此外,我認爲這些二維和三維陣列可以像arr2D [2] [3]和 arr3D [2] [3] [2]這樣的靜態陣列正常訪問。對?
代碼2D
//allocate a 2D array
int** allocate2D(int rows,int cols)
{
int **arr2D;
int i;
arr2D = (int**)malloc(rows*sizeof(int*));
for(i=0;i<rows;i++)
{
arr2D[i] = (int*)malloc(cols*sizeof(int));
}
}
//deallocate a 2D array
void deallocate2D(int** arr2D,int rows)
{
int i;
for(i=0;i<rows;i++)
{
free(arr2D[i]);
}
free(arr2D);
}
代碼3D
//allocate a 3D array
int*** allocate3D(int l,int m,int n)
{
int ***arr3D;
int i,j,k;
arr3D = (int***)malloc(l * sizeof(int **));
for(i=0;i<l;i++)
{
arr3D[i] = (int**)malloc(m * sizeof(int*));
for(j=0;j<m;j++)
{
arr3D[i][j] = (int*)malloc(n*sizeof(int));
}
}
return arr3D;
}
//deallocate a 3D array
void deallocate3D(int arr3D,int l,int m)
{
int i,j;
for(i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
free(arr3D[i][j]);
}
free(arr3D[i]);
}
free(arr3D);
}
您還可以在一個足夠大的單個塊中分配一個n維數組,以包含指針和數據。這樣你可以去int ***** array = allocate(sizeof(int),10,10,10,10,10,0);分配一個5D int數組,並通過數組[a] [b] [c] [d] [e]將其索引,而不需要計算索引。當我需要用堆堆棧來替換大堆棧數組時,我使用了這個代碼,以便在堆棧大小有限的手機上工作,而無需對代碼索引數組進行嚴格調整。看到這裏:https://sourceforge.net/p/gnugos60/code/HEAD/tree/trunk/GNUGoS60/common/src/ndMalloc.cpp – idij 2016-08-03 10:49:02