Strtok apres strdup
Antigone96
Messages postés
5
Statut
Membre
-
jisisv Messages postés 3678 Statut Modérateur -
jisisv Messages postés 3678 Statut Modérateur -
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
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
-
Salut Antigone96,
C'est du pseudo-code dans ton message, je suppose, car la syntaxe destrtok()
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 lefree()
quand tu veux libérer l'espace mémoire que lestrdup()
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 questrdup()
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-
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". -
-
-
-
-
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écutionjohand@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