Conosco algoritmi per allocare/deallocare un array 2D in modo dinamico, tuttavia non sono molto sicuro dello stesso per gli array 3D.
Usando questa conoscenza e un po 'di simmetria, ho trovato il seguente codice.
(Ho avuto difficoltà a visualizzare in 3D durante la codifica).allocazione dinamica/deallocazione di array 2D e 3D
Si prega di commentare la correttezza e suggerire qualsiasi alternativa migliore (in termini di efficienza o intuitivamente), se presente.
Inoltre, penso che entrambi questi array 2D e 3D siano accessibili normalmente come array statici come arr2D [2] [3] e
arr3D [2] [3] [2]. Destra?
Codice in 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);
}
Codice in 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);
}
è anche possibile allocare una matrice n dimensionale in un singolo blocco abbastanza grande da contenere sia i puntatori che i dati. In questo modo puoi andare int ***** array = allocate (sizeof (int), 10, 10, 10, 10, 10, 0); allocare un array int 5D e indicizzarlo con array [a] [b] [c] [d] [e] senza la necessità di calcolare gli indici. L'ho usato quando avevo bisogno di sostituire gli array di stack di grandi dimensioni con quelli di heap per codificare per lavorare su telefoni con dimensioni di stack limitate senza la necessità di eseguire gravi correzioni al codice che indicizza gli array. Vedi qui: https://sourceforge.net/p/gnugos60/code/HEAD/tree/trunk/GNUGoS60/common/src/ndMalloc.cpp – idij