Strtok apres strdup

Antigone96 Messages postés 5 Date d'inscription   Statut Membre Dernière intervention   -  
jisisv Messages postés 3645 Date d'inscription   Statut Modérateur Dernière intervention   -
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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   Statut Membre Dernière intervention  
 
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   Statut Modérateur Dernière intervention   934
 
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