Strtok apres strdup [Fermé]

Signaler
Messages postés
5
Date d'inscription
dimanche 19 octobre 2014
Statut
Membre
Dernière intervention
8 décembre 2016
-
Messages postés
3644
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
-
Bonjour,
je rencontre un problème, quand je fais un copie = strdup(ligne) puis mot1=strtok(copie) puis mot2=strtok(copie). Comment je libère l'espace mémoire ?
strdup fait un malloc mais apres l'allocation est utilisé pour mot1 et mot2 en meme temps.
Sachant que je n'ai plus acces a copie a la fin de mon programme.

Merci

2 réponses

Messages postés
5345
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 juin 2020
877
Salut Antigone96,

C'est du pseudo-code dans ton message, je suppose, car la syntaxe de
strtok()
n'est pas bonne.

http://www.cplusplus.com/reference/cstring/strtok/

Cependant, pour répondre à ta question, il te suffit de conserver l'adresse mémoire vers laquelle pointe copie, avant de la passer à
strtok()
, et de l'utiliser dans le
free()
quand tu veux libérer l'espace mémoire que le
strdup()
avait alloué.

Sur ton commentaire "je n'ai plus acces a copie a la fin de mon programme", j'ajouterai qu'une bonne pratique est de se débrouiller autant que possible pour allouer et libérer l'espace mémoire dans une même fonction, pour identifier allocations et libérations facilement et réduire les risques de fuites mémoire.

Enfin, note aussi que
strdup()
n'existe pas dans le standard du C. C'est une fonction que l'on trouve dans les implémentations POSIX du C (standard pour les systèmes de type Unix, Linux, BSD,...), il n'est pas certain que ton code fonctionne en dehors de ce contexte.


Dal
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 76555 internautes nous ont dit merci ce mois-ci

Messages postés
5
Date d'inscription
dimanche 19 octobre 2014
Statut
Membre
Dernière intervention
8 décembre 2016

Bonsoir,
merci beaucoup pour votre réponse ! Oui c'est du pseudo code, j'essayais de pointer simplement le problème pour avoir plus de chance d'obtenir une réponse.

En fait je fais une fonction qui parse un fichier, dedans j'utilise strdup pour dupliquer la ligne courante (obtenu avec fgets) pour pouvoir la traiter par la suite avec strtok,
le resultat des strtoks sont mis dans des structures que j'utilise par la suite dans mon algo. C'est pour ca que je ne peux pas free tout de suite et après comme je l'ai dis, impossible de recuperer "copie".
Messages postés
5
Date d'inscription
dimanche 19 octobre 2014
Statut
Membre
Dernière intervention
8 décembre 2016

Je ne sais pas comment placer les strtok dans mes structures lors du parse et ensuite liberer dans la meme fonction sans avoir de segmentation fault
Messages postés
5345
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
5 juin 2020
877
Tu peux le faire dans la même fonction si, dans cette même fonction, entre l'allocation et la libération, tu mets tes appels aux fonctions de ton programme qui vont utiliser cette mémoire.

Si cela ne correspond vraiment pas à ta conception, fais autrement, pourvu que ce soit clair :-)
Messages postés
5
Date d'inscription
dimanche 19 octobre 2014
Statut
Membre
Dernière intervention
8 décembre 2016

Non je ne peux pas comme la fonction me sert uniquement a remplir mes structures qui me serviront dans des fonctions apres cette fonction, dans mon main ! Merci de m'avoir aidé bonne soirée ;-)
Messages postés
3644
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
881
Un exemple permet de voir la situation:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/*
       char *strtok(char *str, const char *delim);
*/

int main(int argc, char *argv[])
{
  char *p ;
  char *delim = "/";
  char *fmt = "p = %p %d %d \n";
  printf("%p\n", argv[1]);
  
  p = strtok(argv[1], delim);
  printf(fmt, (void *)p, *p, *(p+1));
  
  while ( p )
    {
      puts(p);
      
      printf(fmt, (void *)p, *p, *(p+1));
      p = strtok(NULL, delim);
    }
  
  return EXIT_SUCCESS;
}


Compilation sous <ial>gcc</ital> ==> exécution
johand@bata:~/src/CCM/C$ ./test_strtok "abc/def/ghi"
0x7fff53301508
p = 0x7fff53301508 97 98
abc
p = 0x7fff53301508 97 98
def
p = 0x7fff5330150c 100 101
ghi
p = 0x7fff53301510 103 104