Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1650 connectés 

  FORUM HardWare.fr
  Programmation
  C

  erreur avec free()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur avec free()

n°2307064
nanataw
Posté le 28-10-2017 à 15:39:05  profilanswer
 

Bonjour tout le monde,
 
J'utilise un pointeur pour transformer chaque char d'une chaine en int, chaine récupérée dans un fichier via la ligne de commande.
Tout va bien sauf quand je veux libérer la mémoire avec free :
 
*** Error in `test': munmap_chunk(): invalid pointer: 0x0000000000a7a018 ***
 
Peut-être parce qu'ayant parcouru la chaine... mais alors comment faire ? rembobiner ?
 

Code :
  1. #include <stdio.h> 
  2. #include <stdlib.h>
  3. int main(int k, char * ldc[])
  4. {
  5. char * chaine = malloc(256) ;
  6. FILE * flux = fopen(ldc[1], "r" ) ;
  7. fgets(chaine, 256, flux) ;
  8. while (*chaine)
  9.   int e ; e = (int) *chaine++ ;     
  10.   printf("%i ", e) ;  }
  11. fclose(flux) ; free(chaine) ;
  12. return 0 ;
  13. }


 
En esperant avoir été clair dans l'exposé de mon problème (je suis pas sur de l'avoir été!)... je remercie d'avance toute aide précieuse sur comment éviter ce message d'erreur ...
 

mood
Publicité
Posté le 28-10-2017 à 15:39:05  profilanswer
 

n°2307070
pluj
Posté le 28-10-2017 à 16:29:58  profilanswer
 

Oui, vu que tu as modifié chaine (l'incrémentes en ligne 10), l'adresse fournie à free ne colle plus [avec celle obtenue du malloc].
 
Passes par une variable intermédiaire par exemple (p ici) :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int k, char * ldc[])
  5. {
  6.    char * chaine = malloc(256);
  7.    FILE * flux = fopen(ldc[1], "r" );
  8.    fgets(chaine, 256, flux);
  9.    for (char  * p = chaine; *p; p++) {
  10.        int e = (int) *p;
  11.        printf("%i ", e);
  12.    }
  13.    fclose(flux);
  14.    free(chaine);
  15.  
  16.    return EXIT_SUCCESS;
  17. }


 
Bon, ça manque de contrôle et compagnie.

Message cité 1 fois
Message édité par pluj le 28-10-2017 à 16:46:43
n°2307071
nanataw
Posté le 28-10-2017 à 16:34:02  profilanswer
 

pluj a écrit :

Oui, vu que tu as modifié chaine (l'incrémentes en ligne 10), l'adresse fournie à free ne colle plus [avec celle obtenue du malloc].
 
Passes par une variable intermédiaire par exemple (p ici) :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(int k, char * ldc[])
  5. {
  6.    char *p, * chaine = malloc(256);
  7.    FILE * flux = fopen(ldc[1], "r" );
  8.    fgets(chaine, 256, flux);
  9.    for (p = chaine; *p; p++) {
  10.        int e = (int) *p;
  11.        printf("%i ", e);
  12.    }
  13.    fclose(flux);
  14.    free(chaine);
  15.  
  16.    return EXIT_SUCCESS;
  17. }


 
Bon, ça manque de contrôle et compagnie.


 
Merci ! c'était donc bien ça le problème. (d'ailleurs je viens de tester, si je fais autant de *chaine-- que de chaine++ effectués avant de faire free() ça marche aussi).
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  erreur avec free()

 

Sujets relatifs
[Java] Erreur java.net.SocketException : socket closed (EOS)erreur avec le group_by depuis la maj de Wamp
[Java] Erreur CompilationProblème de mise en relation formulaire\BaseDeDonnée + Erreur.
Erreur d'exécution 9, l'indice n'appartient pas à la selectionMacro VBA ListBox : erreur si une seule entrée
erreur de sessions chez freeinstallation mediawiki sur compte free.erreur....
Erreur lors de requêtes SQL chez FreePersonnalisation page d'erreur sous free
Plus de sujets relatifs à : erreur avec free()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR