6

配列がありますが、最初 (または最後) の位置は必要ありません。したがって、新しい変数を配列の残りの部分に向けますが、配列の最初/最後の位置を解放する必要があります。例えば:

p = read_csv_file();
q = p + 1; // I don't need the first CSV file field
// Here I'd like to free only the first position of p
return q;

それ以外の場合は、最初の位置を除いて、配列を他の変数に memcpy してから、元の配列を解放する必要があります。このような:

p = read_csv_file();
q = (int*) malloc(sizeof(int) * (SOME_SIZE - 1));
memcpy(q, p+1, sizeof(int) * (SOME_SIZE - 1));
free(p);
return q;

しかし、すべての配列をコピーするオーバーヘッドがあります。

配列の 1 つの位置だけを解放することは可能ですか?

4

2 に答える 2

5

いいえ。 (またはの友人の 1 人)free()への呼び出しから取得できるのは完全なブロックのみであり、そのブロックの一部ではありません。malloc()malloc()

あなたの最善の策は、割り当てられたブロックをそのままにして、配列の先頭であるかのようにインデックス 1 の要素へのポインターを使用することです (最後の要素を無視します)。

2 つの要素を解放する ことが本当にmemcpy重要な場合は、使用が機能します。

また、すべての要素を 1 つ左にシフトし (つまり、インデックス 1 の要素をインデックス 0 に移動するなど)、 を呼び出しrealloc()てブロックのサイズを変更し、最後の 2 つの要素を削除することもできます。ただし、これは実際には良い考えではありません。最も可能性の高い結果は、(a) 基礎となるヒープ割り当てが実際にはサイズ変更されず、物事を移動しても何のメリットも得られないか、または (b)基になるヒープ割り当てのサイズが変更され、すべてがもう一度移動されます

于 2010-06-01T00:37:50.063 に答える
2

それがrealloc(3)目的です。最初の配列要素を解放するには、アルゴリズムを修正することをお勧めします。

于 2010-06-01T00:38:49.937 に答える