erreur avec free()

erreur avec free() - C - Programmation

Marsh Posté le 28-10-2017 à 15:39:05    

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 ...
 

Reply

Marsh Posté le 28-10-2017 à 15:39:05   

Reply

Marsh Posté le 28-10-2017 à 16:29:58    

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
Reply

Marsh Posté le 28-10-2017 à 16:34:02    

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).
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed