Free et Malloc en C

Résolu/Fermé
delp95 Messages postés 17 Date d'inscription samedi 10 septembre 2011 Statut Membre Dernière intervention 16 décembre 2012 - 18 déc. 2011 à 15:47
delp95 Messages postés 17 Date d'inscription samedi 10 septembre 2011 Statut Membre Dernière intervention 16 décembre 2012 - 19 déc. 2011 à 21:43
Bonjour à tous,
j'ai une question qui me bloque, et je ne trouve pas la solution.

J'utilise des malloc dans mon code en C, et je sais qu'ensuite il faut libérer les zones mémoires avec des free. Jusque là tout va bien.

Mon problème est que j'ai besoin d'utiliser un pointeur pour écraser ce même pointeur, et donc allouer une nouvelle zone mémoire à ce pointeur. Mais en faisant ça, je perd l'ancienne adresse, et donc je ne peut plus la libérer. J'ai essayer de sauvegarder l'adresse dans une variable avant d'écraser le pointeur. Puis une fois écrasé, je tente de liberer l'espace mémoire conservé dans la variable de sauvegarde. Mais j'ai l'impression que ça ne fonctionne pas correctement. Et je ne sais pas si c'est comme ça qu'on doit procéder.

Pouvez-vous m'aider s'il vous plait ? (avec un petit exemple si possible)
Merci d'avance.
A voir également:

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 816
18 déc. 2011 à 16:15
Bonjour,

Soit vous n'avez plus besoin de l'allocation, et vous utilisez free avant d'écraser l'adresse sur la zone, soit vous sauvegardez la variable dans un pointeur pour la libérer plus tard.

Mettez un exemple de votre code pour qu'on puisse voir plus précisément votre problème.

Cdlt,
1
delp95 Messages postés 17 Date d'inscription samedi 10 septembre 2011 Statut Membre Dernière intervention 16 décembre 2012
Modifié par delp95 le 18/12/2011 à 16:26
//str est un char* reçu en parametre     


char* prochaineAdresse = NULL;     
char* adresseInterm = NULL; //pour Sauvegarder le pointeur     

   //à l'interieur du str_dup est fait le malloc initial pour prochaineAdresse       
    prochaineAdresse = str_dup(str);     

     //on SAUVEGARDE l'adresse initiale du pointeur     
    adresseInterm = prochaineAdresse;     

//puis on modifie le pointeur de adressePorchaine dans une autre fonction     
//qui retourne une nouvelle adresse (malloc a l'interieur de la fonction)     
prochaineAdresse = str_count(prochaineAdresse);     


//Et la j'aimerai liberer l'espace mémoire utilisé pour l'adresse precedente, c'est pourquoi j'ai créer adresseInterm     
free(adresseInterm);  //est ce que c'est comme ça qu'on fait ???     
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 816
18 déc. 2011 à 16:31
C'est bien comme cela qu'on fait.
Mais dans votre cas, vous pouvez même faire :
free(prochaineAdresse)
prochaineAdresse=str_count(prochaineAdresse);
A moins que vous n'ayez pas tout mis et que vous vous servez de l'ancien pointeur.
0
delp95 Messages postés 17 Date d'inscription samedi 10 septembre 2011 Statut Membre Dernière intervention 16 décembre 2012
Modifié par delp95 le 18/12/2011 à 16:45
je fais ça en fait :
    while(*prochaineAdresse!='\0')   
   {                     
     //on SAUVEGARDE l'adresse initiale du pointeur   
     adresseInterm = prochaineAdresse;        
       
    //on recupere l'adresse du prochain char différent de c   
    prochaineAdresse = str_count(prochaineAdresse, &c, &count);   
      
     //libere adresse intermadresse   
     free(adresseInterm); adresseInterm=NULL;   
   }   


Mais sa m'affiche n'impote quoi a partir de la deuzieme fois qu'on parcourt while
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 816
18 déc. 2011 à 17:01
L'erreur peut venir de str_count. Pourrais-tu poster son code ?
0
delp95 Messages postés 17 Date d'inscription samedi 10 septembre 2011 Statut Membre Dernière intervention 16 décembre 2012
18 déc. 2011 à 17:06
/* ----------------------------------------- */
char* str_count(char *str, char *c, int *count)
/* ----------------------------------------- */
{
//on initialise i
int i=0, n;
char* newAdresse = NULL;

//on recupere la taille de la chaine
n = str_len(str);

//on met le premier char dans c
*c=str[0];

if(n==0)
{
	*count = 0;
	*c = '\0';
	return str;
}
if(n==1)
{
	*count=1;
	*c=str[0];
	return str+n; //adresse de '\0'
}

//tant que les char suivants sont identiques au premier char
while(str[0]==str[i])
{
	//on incrémente i
	i++;
}

*count = i;
  
  //la nouvelle zone est plus petite que l'ancienne, donc on redefini un malloc
  //la zone est égale à la taille de str moins le nombre de char qu'on a passé +1 pour le char null
 newAdresse = malloc((str_len(str)-i+1)*sizeof(char));
 newAdresse = &str[i];  
      
       return newAdresse;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 816
18 déc. 2011 à 17:47
newAdresse = malloc((str_len(str)-i+1)*sizeof(char));
newAdresse = &str[i];

Tu fais une allocation dans le heap avec malloc et ensuite, tu mets newAdresse à &str[i]. En gros tu perds l'allocation...
0