コメントからの続きです。それが有効か無効かについての混乱は、ポインターのどの側面について尋ねられているかを取り囲んでいると思います。上記では、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
すると、不確定ではなくなり、再度割り当てに使用できます。)