構造体を指しているポインターがあるかどうかを尋ねたかったのですが、次に free(struct) し、ポインターを逆参照すると、NULL を指しますか? 私がチェックできるように、ポインター != NULL またはこれは未定義ですか?
ありがとう!
構造体を指しているポインターがあるかどうかを尋ねたかったのですが、次に free(struct) し、ポインターを逆参照すると、NULL を指しますか? 私がチェックできるように、ポインター != NULL またはこれは未定義ですか?
ありがとう!
以下のコードを検討してください
int main()
{
int *p = (int *)malloc(sizeof(int) * 10);
free(p);
}
ここで、変数 p は関数のローカル変数ですmain
。この変数のサイズは、4 バイト (32 ビット m/c の場合) または 8 バイト (64 ビット m/c の場合) になります。これで、10 個の整数要素を格納するためのメモリが割り当てられ、そのアドレスが variable に格納されますp
。ここで、ローカル変数に格納されている動的メモリ アドレスを渡す free 関数を呼び出していますp
。これで free 関数はメモリを解放NULL
し、変数に割り当てることができなくなりますp
。ポインターへの参照ではなく、アドレスを値として渡したためです。
free
以下のようなラッパー関数を定義できます
void myfree(void **p)
{
free(*p);
*p = NULL;
}
int main()
{
int *p = (int *)malloc(sizeof(int) * 10);
myfree(&p);
}
または、マクロ関数も定義できます
#define MYFREE(x) \
free(x); \
x = NULL;
このページを見てください。
それは明確に言っています:
この関数は ptr の値を変更しないままにしておくことに注意してください。したがって、null ポインターではなく、同じ (現在は無効な) 場所を指しています。
解放された後にポインターが逆参照されないようにするのはあなた次第であることに注意してください。