allocation dynamique / désallocation de 2D & amp; Tableaux 3D
Je sais que sur les algorithmes d'allouer/désallouer un tableau 2D de manière dynamique, mais je ne suis pas trop sûr de même pour la 3D tableaux.
Grâce à ce savoir et un peu de symétrie, je suis venu avec le code suivant.
(J'ai eu un moment difficile la visualisation en 3D au cours de codage).
Veuillez formuler des observations sur l'exactitude et de suggérer la meilleure alternative (efficacité-sage ou intuitivement, le cas échéant.
Aussi, je pense que ces deux 2D et 3D les tableaux peuvent être accessibles normalement comme les tableaux statiques comme arr2D[2][3] et
arr3D[2][3][2]. Droit?
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 la 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);
}
source d'informationauteur Ankur
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également allouer un tableau et calculer les indices individuels. Ce processus nécessite moins d'allocateur des appels et des résultats à la fois moins de fragmentation et de mieux cache utiliser.
Maintenant
arr2d[r][c]
devientarr2d.data[r * arr2d.b + c]
. Libération de la mémoire est libre (). En bonus, vous êtes sûr de toujours garder votre tableau dynamique tailles avec vous.Extrapolant à la 3d:
Vous devriez encapsuler ces opérations d'index (et la (-) dotations d'ailleurs) dans une autre fonction ou une macro.
(Les noms de r, c, et d pourrait être mieux—j'allais pour de ligne, de colonne et de la profondeur. Tout a, b, et c sont les limites de leurs dimensions correspondantes, vous préférerez peut-être quelque chose comme n1, n2, n3, ou encore utiliser un tableau pour eux.)
arr3d devrait être un triple pointeur et pas seulement un int. Sinon tout a l'air correct:
arr3D est un pointeur de pointeur de pointeur, donc arr3D[i] est un pointeur de pointeur et arr3D[i][j] un pointeur. Il est approprié de libérer la dimension plus bas dans une boucle, d'abord, et ensuite monter les dimensions jusqu'à arr3D lui-même est libéré.
Aussi c'est plus idiomatique donner
malloc
la sizeof du pointu type implicitement. Au lieu de::
Et oui, ces allouée dynamiquement multi-dimensions des tableaux peut être consulté, tout comme statique multi-dimensions des tableaux.
Vous pouvez voir le code ci-dessous:
Pour plus de détails, voir ce lien Tableau 3d
Ceci est une version de l'idée à la question, mais en utilisant seulement un malloc, inspiré par les autres réponses. Il permet une utilisation intuitive des crochets et un nettoyage facile. J'espère qu'il ne fait pas de n'importe quel compilateur de mise en œuvre spécifique de l'assomption.