Réinitialisation de pointeur en C
Résolu
meyegui
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un problème de pointeurs dans un petit programme en C. J'aimerais faire une fonction qui libère la mémoire allouée par une autre, et réinitialise un pointeur à NULL.
Mais ça ne fonctionne pas...
Voici mon code, et si quelqu'un peut me dire ce que je fais faux, ce sera volontiers :)
Note : j'ai volontairement simplifié le code pour se focaliser sur le problème du pointeur.
J'ai un problème de pointeurs dans un petit programme en C. J'aimerais faire une fonction qui libère la mémoire allouée par une autre, et réinitialise un pointeur à NULL.
Mais ça ne fonctionne pas...
Voici mon code, et si quelqu'un peut me dire ce que je fais faux, ce sera volontiers :)
Note : j'ai volontairement simplifié le code pour se focaliser sur le problème du pointeur.
#include <stdio.h> #include <stdlib.h> // Type "Chaîne de caractères" typedef struct testStr { char *text; } Str; // Initialise une nouvelle chaîne de caractères Str* CreateNew(char *s) { Str *myString = malloc(sizeof(myString)); myString->text = s; return myString; } // Libère une chaîne de caractères void DeleteStr(Str *s) { free(s->text); s->text = NULL; s = NULL; // <------- ici : réinitialisation du pointeur } /* ********************************************* */ int main() { /* Alloue une plage mémoire contenant "blablah" */ Str *string = CreateNew("blablah"); printf("%X -> %s\n", string,string->text); // affiche le texte ("blablah") /* Libère la plage mémoire et doit réinitialiser le pointeur à NULL */ DeleteStr(string); printf("%X\n", string); // ici : string ne pointe pas sur NULL // mais sur la même plage mémoire qu'avant ! return EXIT_SUCCESS; }
A voir également:
- Réinitialisation de pointeur en C
- Reinitialisation pc - Guide
- Pointeur souris - Guide
- Curseur Windows 10 : comment bien voir la souris à l'écran - Guide
- Code de réinitialisation itel touche ✓ - Forum Mobile
- Itel it5622 code universel de mot de passe - Forum Mobile
1 réponse
Bonjour,
Il faut passer par un double pointeur pour faire ce dont vous souhaitez.
Il faut donc mettre Str **myString; *myString=malloc(...); return *myString; dans la fonction Create.
Dans la fonction Delete, le prototype sera void DeleteStr(Str **s); pour le reste ça sera : (*s)->text=s; *s=NULL;
Et pour appeler la fonction DeleteStr, il faudra mettre : DeleteStr(&string);
Et cela devrait mieux marcher.
Cdlt,
Il faut passer par un double pointeur pour faire ce dont vous souhaitez.
Il faut donc mettre Str **myString; *myString=malloc(...); return *myString; dans la fonction Create.
Dans la fonction Delete, le prototype sera void DeleteStr(Str **s); pour le reste ça sera : (*s)->text=s; *s=NULL;
Et pour appeler la fonction DeleteStr, il faudra mettre : DeleteStr(&string);
Et cela devrait mieux marcher.
Cdlt,