Pourquoi mon pointeur non null après libre?
void getFree(void *ptr)
{
if(ptr != NULL)
{
free(ptr);
ptr = NULL;
}
return;
}
int main()
{
char *a;
a=malloc(10);
getFree(a);
if(a==NULL)
printf("it is null");
else
printf("not null");
}
Pourquoi la sortie de ce programme n'est pas NULLE?
Le conditionnel avant
free
n'est pas nécessaire. Il est parfaitement OK pour appeler free(0)
.
OriginalL'auteur Jeegar Patel | 2011-09-30
Vous devez vous connecter pour publier un commentaire.
Parce que le pointeur est copié en valeur à votre fonction. L'affectation d'
NULL
à la copie locale de la variable (ptr
). Ce n'est pas de l'attribuer à l'original.La mémoire sera toujours libéré, de sorte que vous ne pouvez plus accéder en toute sécurité, mais l'original de votre pointeur ne sera pas
NULL
.- Ce le même que si vous étiez de passage d'un
int
à une fonction à la place. Vous ne vous attendriez pas à l'origineint
être modifiée par la fonction, sauf si vous avez été en passant un pointeur.Si vous voulez null le pointeur d'origine, vous aurez à passer un pointeur de pointeur:
OriginalL'auteur Merlyn Morgan-Graham
Parce que le
getFree()
fonction prend une copie du pointeur.ptr
etc
sont à la fois des pointeurs, mais ils sont des variables différentes. C'est la même raison pourquoi cette fonction de sortie "6":OriginalL'auteur Vilx-
Vous êtes de passage du pointeur de
a
par la valeur, il n'est pas modifié par la fonction. C'est seulement une copie du pointeur modifiés à l'intérieur de la fonction, la variable d'origine valeur n'est pas affectée.Mise à jour:
Si vous souhaitez rendre votre vie plus facile en remplacement de libérer + micropression une variable avec une seule ligne de code, vous avez besoin d'une macro:
ou une fonction avec un pointeur de pointeur en argument:
getFree
fonction n'a pas accès à la variable d'origine, c'est seulement la modification d'une copie dea
sur la pile.Références n'existent pas en C.
+1 pour comprendre pourquoi je fais cela..!! je vais utiliser maintenant macro ur
Merci pour la correction, j'ai pensé à deux autres options s'appliquent toujours.
OriginalL'auteur Roman R.
Les pointeurs sont stockés comme des entiers quelque part dans la mémoire.
Lorsque vous ne
a = malloc(10);
,a
a une certaine valeur, dire 0x1.Lorsque vous appelez
getFree(a);
, la fonction copiea
envoid *ptr
.Maintenant
a=0x1
etptr=0x1
.Lorsque vous ne
ptr=NULL
, seulementptr
est changé à NULL, maisa
est encore 0x1..OriginalL'auteur wormsparty
Vous passez le pointeur de la valeur.. (Par défaut C qui passe à l'argument par valeur), ce qui signifie que vous mettez à jour la copie seulement ..pas l'emplacement réel..pour que vous pourriez avoir besoin d'utiliser de pointeur de pointeur en C
free
.Je pense, je m'ennuie de le lire.. désolé..j'ai fait la correction s'il vous plaît vérifier 😀
OriginalL'auteur Aman Agarwal