3

C の free() について質問があります。

構造体へのポインターがあるとします (ノード *ptr など)。それを解放した後、それを NULL に初期化し、malloc() または realloc() を使用して新しい場所を指すようにできますか?

例えば:

node *ptr=NULL;
ptr=realloc(ptr,sizeof(node)); //works exactly like malloc

/* Do some operations on ptr */

free(ptr);

ptr=NULL;
ptr=realloc(ptr,sizeof(node));

それは有効ですか、それとも問題を引き起こしますか。malloc の代わりに realloc を使用した理由は、すべての realloc() 呼び出しがループ内にあるためです (したがって、2 番目の引数の sizeof(node) の代わりに、実際には n*sizeof(node) であり、n は増加し続けます...この結果の配列の最後の場所には新しいデータが書き込まれます) ここで、ptr が指すメモリはループが終了するまで増加し続けます。その時点で、ptr が指すメモリ内のデータは必要ありません。それを解放するのが最善です。現在、これはすべて、もう 1 つの大きな (外側の) ループにネストされています。

助けてくれてどうもありがとう

4

3 に答える 3

9

大丈夫です -実際にはポインターを再利用しているのではなく、ポインターを保持している変数だけを再利用しています。

于 2010-02-15T14:49:54.123 に答える
7

ptr一度値が割り当てられたことを覚えておらず、 NULL が割り当てられた場合に再度使用することは、最初に使用することと同じです。

また、NULL ポインターが渡されたときのrealloc()ように動作するため、問題なく動作するはずです。malloc()

于 2010-02-15T14:49:26.107 に答える
4

「ポインターを解放する」と考えるべきではありませんが、ポインターが指すものは何でも解放します。ポインターが最初に 1 つのオブジェクト (後で解放される可能性があります) を指し、次に別のオブジェクトを指すことはまったく正常です。

于 2010-02-15T14:52:08.243 に答える