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
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
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
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
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 à
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
Dal
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
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
8 déc. 2016 à 21:11
Un exemple permet de voir la situation:
Compilation sous <ial>gcc</ital> ==> exécution
#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
8 déc. 2016 à 18:43
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".
8 déc. 2016 à 18:45
8 déc. 2016 à 20:10
Si cela ne correspond vraiment pas à ta conception, fais autrement, pourvu que ce soit clair :-)
8 déc. 2016 à 20:47