timy94
Messages postés50Date d'inscriptionjeudi 17 novembre 2005StatutMembreDernière intervention 7 janvier 2009
-
30 nov. 2006 à 14:42
cs_Matt67
Messages postés549Date d'inscriptionsamedi 6 septembre 2003StatutMembreDernière intervention 6 mars 2010
-
3 déc. 2006 à 20:46
Je dispose de deux structures identiques . L'une est la principale l'autre est une structure temporaire.
La structure principale MYSTRUCT est visible à l'interieur du main(), la structure tempo n'est visible que dans une fonction TOTO.
main () {
struct tar ** MYSTRUCT ;
//Programme
La fonction TOTO est appelé à l'interieur du main, comme ceci
TOTO (MYSTRUCT);
return 0;
}
void TOTO (struct tar ** p) { struct tar * tempo1;
tempo1 = (struct tar *) calloc (1,sizeof (struct tar));
/**********/
//Boucle [j][ i] de tri pour ranger les strucutures j++ i++
tempo1 = p[kmax];
p[kmax] = p[i] ;
p[i] = tempo1;
// pour liberer la strucutre tempo
free (tempo1 );
}
En faite quand je libère tempo1 je touche aussi à la strucutre p [dernier i]
car quand je fait tempo1 = p[kmax], tempo1 contient l'adress de p[kmax] et à la fin de mon tri
tempo1 pointe sur le dernier p[kmax]. quand je fait free (tempo1) je libère de fait p[kmax]. Arglll!
Question 1 ;est-il utile de liberer la zone memoire de la tructure tempo1 avant de sortir de la fonction. Ou est-elle liberée en sortie de la fonction.
Question 2 ;j'ai fait pointé le pointeur tempo1 sur une zone vide en fin de boucle est je
fais free, comme ceci
tempo1 = 0;
free (tempo1);
trempo1 = 0 n'est pas dangereux?
Question 3; free (tempo1) fait quoi au juste? Il libère la zone pointée vers la strucutre et initialise le pointeur?
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 30 nov. 2006 à 15:38
1. Allocation dynamique = libération manuelle obligatoire. Sinon, libérer en fin de programme par Windows mais mieu vaut libérer manuellement. Aucun risque comme ça.
2. Mieu vaut pas libérer un pointeur nulle. Il pourrait ce produire des exceptions.
3. Si j'ai bien compris, tempo1 est un pointeur et d'après le code, il pointe sur p[kmax]. Si tu fais free(tempo1), tu libère donc p[kmax].