Réinitialisation de pointeur en C

Résolu/Fermé
meyegui - 6 mai 2011 à 12:13
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 6 mai 2011 à 13:42
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.


#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;
}



1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
6 mai 2011 à 13:42
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,
0