继续评论。我认为关于它是有效还是无效的混淆围绕着指针的哪个方面被询问。上面,free(p);
影响指向的内存块的起始地址p
,它不影响p
本身的地址,它仍然有效。不再有一个地址由p
(作为它的值)持有,使其在重新分配之前是不确定的。一个简短的例子有帮助:
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int *p = NULL;
printf ("\n the address of 'p' (&p) : %p\n", &p);
p = malloc (sizeof *p);
if (!p) return 1;
*p = 3;
printf (" the address of 'p' (&p) : %p p points to %p with value %d\n",
&p, p, *p);
free (p);
/* 'address of p' unchanged, p itself indeterminate until reassigned */
printf (" the address of 'p' (&p) : %p\n\n", &p);
p = NULL; /* p no longer indeterminate and can be allocated again */
return 0;
}
输出
$ ./bin/pointer_addr
the address of 'p' (&p) : 0x7fff79e2e8a0
the address of 'p' (&p) : 0x7fff79e2e8a0 p points to 0x12be010 with value 3
the address of 'p' (&p) : 0x7fff79e2e8a0
自身的地址p
不会被malloc
或改变free
。影响的是p
(或更准确地说,地址p
存储为其值)的值。free
之后,地址存储被释放p
到系统,不能再通过p
。一旦你明确地重新分配p = NULL;
p
不再是不确定的,可以再次用于分配。)