Utilisation de free avec les structures

timy94 Messages postés 50 Date d'inscription jeudi 17 novembre 2005 Statut Membre Dernière intervention 7 janvier 2009 - 30 nov. 2006 à 14:42
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Derniè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?

MERCI 

Timy94</gras>

3 réponses

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
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].

C++ (@++)<!--
0
timy94 Messages postés 50 Date d'inscription jeudi 17 novembre 2005 Statut Membre Dernière intervention 7 janvier 2009
30 nov. 2006 à 15:59
Voila la fonction tri avec en fin les free

/********************************************************************************


* *


* Fonction : tri_tar *


* *


* Objet : Tri du tar pour affichege *


* *


********************************************************************************/


 


void tri_tar (struct tar ** p, int nb, char * critere) {


 


/*------------------------------ DECLARATIONS ------------------------*/








int i,j=0, kmax=0;


struct tar * tempo1;





char DateKmax[12];


char DateJ [12];


int numpara = 0;


int indice = 0;


char * p_tmp;


 


 


/*---------------------------- DEBUT DE TRAITEMENT --------------------*/


 


p_tmp = (char * ) malloc (255);


tempo1 = (struct tar *) calloc (1,sizeof (struct tar));


//Boucles de tri


for (i = 0 ; i < nb ; i++) {


kmax = i;


for (j = i+1; j <= nb ; j++) {


if (!strcmp(critere,"droits")) if (strcmp (p[kmax]->droits,p[j]->droits) > 0) kmax = j;


if (!strcmp(critere,"groupe")) if (strcmp (p[kmax]->groupe,p[j]->groupe) > 0) kmax = j;


if (!strcmp(critere,"chemin")) if (strcmp (p[kmax]->chemin,p[j]->chemin) > 0) kmax = j;


if (!strcmp(critere,"nom")) if (strcmp (p[kmax]->nom, p[j]->nom) > 0) kmax = j;


if (!strcmp(critere,"taille")) if (atoi(p[kmax]->taille) > atoi(p[j]->taille)) kmax = j;


if (!strcmp(critere,"date")) {


//Extraction de la date de kmax


numpara = 0;


indice = 0;


while (p[kmax]->date [indice]!='\0') {


//"indice" est incrémenté par scanligne


scanligne (p[kmax]->date,p_tmp,&indice, '-', '\0');


switch (numpara) {


case 0:


strcpy (DateKmax,p_tmp); break;


case 1:


strcat (DateKmax,p_tmp); break;


case 2:


strcat (DateKmax,p_tmp); break;


}


numpara++;


}


//Extraction de la date de j


numpara = 0;


indice = 0;


while (p[j]->date [indice]!='\0') {


//"indice" est incrémenté par scanligne


scanligne (p[j]->date,p_tmp,&indice, '-', '\0');


switch (numpara) {


case 0:


strcpy (DateJ,p_tmp); break;


case 1:


strcat (DateJ,p_tmp); break;


case 2:


strcat (DateJ,p_tmp); break;


}


numpara++;


}


if (atoi(DateKmax) > atoi(DateJ)) kmax = j;


}


}


//Permutation des valeur après compar aision de deux valeurs


tempo1 = p[kmax];


p[kmax] = p[i] ;


p[i] = tempo1;


}


//strcpy(tempo1.nom,"VIDE");


tempo1=0;


free (tempo1 );


free (p_tmp );


}













Timy94
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
3 déc. 2006 à 20:46
Bonsoir,

Dans ta fonction toto, tu n'as pas besoin d'allouer de la memoire pour tempo1 car tu lui affectes un pointeur (tempo1 = p[kmax]) :

void TOTO (struct tar ** p)
{
struct tar * tempo1 = NULL;

/**********/
//Boucle [j][ i] de tri pour ranger les strucutures j++ i++

tempo1 = p[kmax];
p[kmax] = p[i] ;
p[i] = tempo1;
}

Bonne soirée,

Bertrand
0
Rejoignez-nous