Strtok apres strdup

Fermé
Antigone96 Messages postés 5 Date d'inscription dimanche 19 octobre 2014 Statut Membre Dernière intervention 8 décembre 2016 - 8 déc. 2016 à 16:43
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 - 8 déc. 2016 à 21:11
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

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 8/12/2016 à 18:45
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
Antigone96 Messages postés 5 Date d'inscription dimanche 19 octobre 2014 Statut Membre Dernière intervention 8 décembre 2016
8 déc. 2016 à 18:43
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".
0
Antigone96 Messages postés 5 Date d'inscription dimanche 19 octobre 2014 Statut Membre Dernière intervention 8 décembre 2016
8 déc. 2016 à 18:45
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
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
8 déc. 2016 à 20:10
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 :-)
0
Antigone96 Messages postés 5 Date d'inscription dimanche 19 octobre 2014 Statut Membre Dernière intervention 8 décembre 2016
8 déc. 2016 à 20:47
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 ;-)
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
8 déc. 2016 à 21:11
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

0