bonjour comment allouer la mémoire pour un tableau 3 D?
bonjour comment allouer la mémoire pour un tableau 3 D?
Salut,
En calculant le nombre d'éléments de ton tableau * la taille d'une cellule
Ou je ne comprend pas bien ta question ?
K
non je voulais savoir avoir les malloc car je ne connais pas au départ la taille de mon tableau;
int *** tableau_3D;
et j'ai par exemple hauteur , largeur, profondeur comme dimentions
Quelles boucles avec malloc dois je faire?
Bonjour,
le principe est le même qu'avec 2 dimensions :
Comment allouer dynamiquement un tableau à 2 dimensions ?
alors pour un 3-D je dois ajouter dans le boucle de i une boucle j :
//1D
tab = malloc ( sizeof(*tab) * taille);
//2D
for (i=0; i<taille; i++)
{
tab[i] = malloc ( sizeof(**tab) * taille2);
//3D
for (j=0; j<taille; j++)
tab[i] [j]= malloc ( sizeof(**tab) * taille3);
}
??? C'EST ÇA?
Lorsqu'on fait de l'allocation dynamique, il faut toujours faire des tests sur le retour de la fonction malloc. C'est une erreur grave de ne pas le faire...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 int ***allocation(int premdim, int deuxdim, int troisdim) { int i,j,k; int ***res; //1ere dimension res = (int ***) malloc(sizeof(int**) * premdim); if(res==NULL) return NULL; //2ere dimension for(i=0;i<premdim;i++) { printf("%d\n",i); res[i] = (int **) malloc(sizeof(int *) * deuxdim); if(res[i] == NULL) { //Probleme on libére la mémoire for(; i>=0;i--) free(res[i]); free(res); return NULL; } //2eme dimension for(j=0;j<deuxdim;j++) { res[i][j] = (int *) malloc(sizeof(int) * troisdim); //Si probleme if(res[i][j] == NULL) { //On libere la memoire for(;j>=0;j--) free(res[i][j]); for(i=0;i<premdim;i++) free(res[i]); free(res); return NULL; } //Initialisation à 0 for(k=0;k<troisdim;k++) res[i][j][k] = 0; } } return res; }
merci beucoup tout le monde qui m'a répondu
Le même en un peu plus court avec le code de destruction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 int *** CreerTab(int dim1, int dim2, int dim3) { int i; int * p = malloc(dim1*dim2*dim3*sizeof(int)); int **pp = malloc(dim1*dim2*sizeof(int*)); int *** tab = malloc(dim1*sizeof(int**)); if(p==NULL || pp==NULL|| tab ==NULL) { free(p); free(pp); free(tab); return NULL; } for(i=0; i<dim2*dim1;i++) pp[i] = p+i*dim3; for(i=0; i<dim1;i++) tab[i] = pp+i*dim2; return tab; } void DetruireTab(int*** Tab) { free(Tab[0][0]); free(Tab[0]); free(Tab); } .... int*** tab; tab = CreerTab(2,3,5); ..... tab[1][2][3] = 12345; tab[0][1][2] = 789; .... DetruireTab(tab);
Publication : Concepts en C
Mon avatar : Glenn Gould
--------------------------------------------------------------------------
Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
Faut-il encore pouvoir faire l'allocation... Pas toujours possible. Ma solution découpe la mémoire en plusieurs sous-blocs...int * p = malloc(dim1*dim2*dim3*sizeof(int));
Mais je suis d'accord avec ta solution...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager