Кажется, что у вас есть ментальная модель, где вы ожидаете, что указатели будут контролироваться магическим образом, так что один указатель «знает», что происходит с другим.
Это не то, как указатели, или модель памяти C, работают вообще.
Нет связи между различными указателями. Если два указателя указывают на один и тот же адрес, а один из них free()
, другой становится недействительным , но его значение не изменяется. Также значение первого; это просто, что разыменование одного из них просто стало недействительным.
Рассмотрим это:
int *a = malloc(sizeof *a);
if(a != NULL)
{
int *b = a;
*a = 4711;
printf("a=%p\nb=%p\n", (void *) a, (void *) b);
free(b); /* same pointer that malloc() returned, this is fine */
printf("a=%p\nb=%p\n", (void *) a, (void *) b);
}
выше будет печатать на тот же адрес в четыре раза, так как значение любого из указателей не меняется только потому, что вы называете free()
на одном из них. Помните, что free()
не волшебство, это просто функция. С ним нет специальных скрытых функций, вы можете написать свои собственные malloc()
и free()
, если вам это нравится, и получите ту же семантику.
[Пожалуйста, не набрасывайте возвращаемое значение 'malloc()' in C] (http://stackoverflow.com/a/605858/28169). – unwind
@unwind Вы должны указать возвращаемое значение 'malloc()', потому что оно возвращает 'void *', правильно? –