Bonjour,
pour désallouer un pointeur on utilise la fonction free(), mais comment désallouer un pointeur de pointeur ?
merci de votrer réponse, ;)
Version imprimable
Bonjour,
pour désallouer un pointeur on utilise la fonction free(), mais comment désallouer un pointeur de pointeur ?
merci de votrer réponse, ;)
Bah free pareil.Citation:
Envoyé par FamiDoo
free(*pointeur);
float **p;
free(*p) ?
Pour chaque malloc tu as un free. Tout dépend ensuite de ce que tu fais avec ton pointeur sur pointeur.
Bonjour,
admetons que tu as alloué de cette façon :
ceci est une méthode assez classique pour allouer un **.Code:
1
2
3
4
5
6
7
8
9
10 int **ToTo ; ToTo = malloc(Hauteur*sizeof(int *)) ; assert(ToTo != NULL) ; for (i=0 ; i < Hauteur ; i++) { ToTo[i] = malloc(Largeur*sizeof(int)) ; assert(ToTo[i] != NULL) ; }
Pour la désallouer, il faut faire l'inverse avec free :
Et selon les compilateur et l'OS, tu peux (voire tu dois) rajouter :Code:
1
2
3
4 for (i=0 ; i < Hauteur ; i++) free(ToTo[i]) ; free(ToTo) ;
Bonne continuationCode:ToTo = NULL ;
Absolument aucun rapport avec le compilateur ou l'OS. Le fait de donner à un pointeur une valeur cohérente est une question de Bonne Pratique. C'est tout.Citation:
Envoyé par ToTo13
exact ça devrait fonctionnerCitation:
free(*p) ?
Ca dépend comment a été alloué p[0] et si il existe des p[1], p[2] etc.Citation:
Envoyé par pit9.76
Ca a déjà été expliqué...
ça compile ça ? n'y a t il pas un probleme avec "ToTo[i]" alors que la déclaration est "int ** ToTo;". ne faudrait il pas avoir :Citation:
int **ToTo ;
ToTo = malloc(Hauteur*sizeof(int *)) ;
assert(ToTo != NULL) ;
for (i=0 ; i < Hauteur ; i++)
{
ToTo[i] = malloc(Largeur*sizeof(int)) ;
assert(ToTo[i] != NULL) ;
}
"int ** (ToTo[N])
Non.Citation:
Envoyé par pit9.76
Revision de cours sur les pointeurs requise?
ToTo[i] renvoie un pointeur, c'est tout.Citation:
Envoyé par pit9.76
effectivement :oops:Citation:
Revision de cours sur les pointeurs requise?
int * ptr <=> int ptr[] ( c'est ça ?)
Non c'est différent.Citation:
Envoyé par pit9.76
A gauche un pointeur sur 1 entier, à droite un tableau de n entiers qui revient à déclarer en même temps un pointeur, sur la 1ere case du tableau, et réserver une zone mémoire.
ok ça je comprend, ce que je comprend pas finalement c'est comment il peut manipuler son pointeur toto avec []. ToTo[i] est équivalent à quoi? (en utilisant des *)Citation:
A gauche un pointeur sur 1 entier, à droite un tableau de n entiers qui revient à déclarer en même temps un pointeur, sur la 1ere case du tableau, et réserver une zone mémoire.
P.S. :désolé si je comprend rien j'ai le cerveau lent :mouarf:........:dehors:
L'opérateur "[]" permet d'accéder à des éléments situés à la suite d'un pointeur en indiquant un offset.
Il est utilisé par les pointeurs et les tableaux.
Avant de l'utiliser il faut s'assurer que l'offset pointe sur une zone mémoire valide: réservée dynamiquement ou statiquement.
AllocationLibérationCode:
1
2
3
4
5
6
7
8
9 int **ToTo ; ToTo = malloc(Hauteur*sizeof(int *)) ; assert(ToTo != NULL) ; for (i=0 ; i < Hauteur ; i++) { ToTo[i] = malloc(Largeur*sizeof(int)) ; assert(ToTo[i] != NULL) ; }
Code:
1
2
3
4
5 for (i=0 ; i < Hauteur ; i++) { free(ToTo[i]) ; } free(Toto);
Merci pour toutes ces réponses.
J'aimerai avoir toutefois une précision.
Concernant le "assert", à quoi cela sert-il ?
De plus, si je fais un malloc pour mon tableau dynamique et qu'il contient des valeurs.
Est ce que lors d'un realloc, les valeurs du tableau seront conservées ?
"Assert" permet de quitter le programme en affichant un message.
Oui, la zone mémoire est étendue en conservant le contenu.Citation:
Est ce que lors d'un realloc, les valeurs du tableau seront conservées ?
La macro assert() n,'est utilisée qu'en phase de debug. Elle sert à 'pieger' le code (traps) sur des comportements interdits résultant d'un mauvais codage.Citation:
Envoyé par FamiDoo
En aucun cas, on ne doit utiliser assert() pour traiter des erreurs liées au système (erreur mémoire, I/O...) ni à l'utilisateur.
Ceci pour une raison simple, en phase de production (release), la macro globale NDEBUG est définie, ce qui a pour conséquence de ne pas compiler les macros assert().
Oui, c'est garanti par le langage (heureusement). Par contre, les nouvelles valeurs seront évidemment indéterminées. Il peut être utilise de les initialiser...Citation:
De plus, si je fais un malloc pour mon tableau dynamique et qu'il contient des valeurs.
Est ce que lors d'un realloc, les valeurs du tableau seront conservées ?
Pas d'accord. assert(), c'est pas fait pour ça.Citation:
Envoyé par Trap D
Voir ma réponse à FamiDoo...