Поскольку указатель копируется по значению в вашу функцию.Вы присваиваете NULL
локальной копии переменной (ptr
).Это не присваивает его исходной копии.
Память все еще будет освобождена, поэтому вы больше не сможете безопасно получить к ней доступ, но ваш оригинальный указатель не будет NULL
.
Thisтак же, как если бы вы вместо этого передавали int
функции.Вы не ожидаете, что оригинал int
будет отредактирован этой функцией, если только вы не передали указатель на него.
void setInt(int someValue) {
someValue = 5;
}
int main() {
int someOtherValue = 7;
setInt(someOtherValue);
printf("%i\n", someOtherValue); // You'd expect this to print 7, not 5...
return 0;
}
Если вы хотите обнулить исходный указатель, вам придется пройтиуказатель на указатель:
void getFree(void** ptr) {
/* Note we are dereferencing the outer pointer,
so we're directly editing the original pointer */
if (*ptr != NULL) {
/* The C standard guarantees that free() safely handles NULL,
but I'm leaving the NULL check to make the example more clear.
Remove the "if" check above, in your own code */
free(*ptr);
*ptr = NULL;
}
return;
}
int main() {
char *a;
a = malloc(10);
getFree(&a); /* Pass a pointer-to-pointer */
if (a == NULL) {
printf("it is null");
} else {
printf("not null");
}
return 0;
}