1

以下のコードの最後で、free()、array、または temp_array にプラグインする必要があるポインターはどれですか? どちらがメモリブロックを解放するか、どちらが解放されるかは問題ですか?

int *array = 0;
int *temp_array = 0;
int count = 0;

array = malloc(sizeof(int));

// skipping code where count is calculated...

temp_array = realloc(array, count * sizeof(int));

if (temp_array == NULL) {
    free(array);
    // some error message
    return;
}
array = temp_array;

// skipping section of code, which reads numbers from a file and loads them into an array
// amount of numbers read can be 0 to whatever

free (array); // free array or temp_array?

また、メモリを割り当てようとしているポインタが NULL の場合、realloc でメモリのブロックを割り当てることは可能ですか (つまり、最初に malloc でメモリを割り当て、後で realloc でサイズを変更する必要がありますか? malloc)?

4

1 に答える 1

1

それは問題ではありません - と の両方が同じメモリ ブロックtemp_arrayarray指しています。temp_array私は、realloc と free ポインターが一致することを好みます。作業コードによっては、保護のために両方のポインターを NULL に割り当てて、メモリが 2 回解放されるのを防ぐことを検討できます。free(NULL)安全です - 操作は実行されません。

1 つの整数の初期割り当てについて - それは必要ですか? 示されているコードから、スタックで定義された int が望ましいでしょう。

編集: OPからの詳細情報(コメント内)の後、ファイル内のレコード数を保持するヘッダー値を使用してコードを簡素化できるようです。これにより、再割り当ての必要がなくなり、ファイルの値を読み込む前にメモリを割り当てることができます。

于 2014-06-23T19:30:06.490 に答える