0

構造体を指しているポインターがあるかどうかを尋ねたかったのですが、次に free(struct) し、ポインターを逆参照すると、NULL を指しますか? 私がチェックできるように、ポインター != NULL またはこれは未定義ですか?

ありがとう!

4

4 に答える 4

1

以下のコードを検討してください

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; 
于 2012-08-09T02:07:34.350 に答える
-1

このページを見てください。

それは明確に言っています:

この関数は ptr の値を変更しないままにしておくことに注意してください。したがって、null ポインターではなく、同じ (現在は無効な) 場所を指しています。

解放された後にポインターが逆参照されないようにするのはあなた次第であることに注意してください。

于 2012-08-09T00:01:35.343 に答える