Je connais les algorithmes pour allouer/désallouer un tableau 2D dynamiquement, mais je ne suis pas sûr de la même chose pour les tableaux 3D.
En utilisant cette connaissance et un peu de symétrie, j'ai trouvé le code suivant.
(J'ai eu du mal à visualiser en 3D pendant le codage).allocation dynamique/désallocation des tableaux 2D et 3D
S'il vous plaît commenter l'exactitude et suggérer une meilleure alternative (efficacité-sage ou intuitivement), le cas échéant.
En outre, je pense que ces deux tableaux 2D et 3D sont accessibles normalement comme des tableaux statiques comme arr2D [2] [3] et
arr3D [2] [3] [2]. Droite?
code 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);
}
Code pour 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);
}
vous pouvez également allouer un tableau de dimension n dans un seul bloc assez grand pour contenir à la fois des pointeurs et des données. De cette façon, vous pouvez aller int ***** array = allouer (sizeof (int), 10, 10, 10, 10, 10, 0); pour allouer un tableau int 5D, et l'indexer par tableau [a] [b] [c] [d] [e] sans avoir besoin de calculer les indices. J'ai utilisé ceci quand j'ai eu besoin de remplacer les grands tableaux de pile par ceux de tas pour coder pour travailler sur des téléphones avec une taille de pile limitée sans avoir besoin de faire un ajustement sérieux au code indexant les tableaux. Voir ici: https://sourceforge.net/p/gnugos60/code/HEAD/tree/trunk/GNUGoS60/common/src/ndMalloc.cpp – idij