11

Cの学習を始めたばかりで、次の問題に遭遇しました。

C で整数配列を縮小し、最後に要素を削除する必要があります。取り除くということは、解放を意味します。一般的な答えは、小さい方の配列に新しいメモリを割り当て、その後、元の配列のすべての項目 ( -items to remove ) を新しく割り当てたメモリにコピーしてから、元の配列を free() することです。

非常に大きな配列を処理する必要があるため、コピーの部分は省略します。

サイズ「配列の終わり - 終わり近く」の「元の配列の終わり近く」を指すポインター変数を作成し、そのポインターを解放することは可能でしょうか?

前もって感謝します

4

4 に答える 4

5

C 標準ライブラリのrealloc関数が必要な場合があります。

あなたの場合、メモリマネージャーには新しいメモリゾーンを割り当てる理由がないため、コピー操作を実行しない可能性があります。古いサイズと新しいサイズの差だけが、使用可能なメモリとしてシステムによって再利用される場合があります。

malloc とその仲間は、「現在の」ゾーンの後のメモリが実際に解放されていることを保証しないため、配列を大きくするとコピーが発生します。そうであれば、問題ありません。現在のメモリ割り当てが拡張されます。そうでない場合は、より大きな使用可能なメモリ ゾーンを見つける必要があり、メモリ内のほとんどどこにでも割り当てることができます。

于 2012-08-29T19:06:23.087 に答える
2

Have you thought about using realloc ?

int main(void)
{
    int *array = NULL, *tmp;

    if(!(array = malloc(5 * sizeof(int)))) return 1;
    if(!(tmp = realloc(array, 2*sizeof(int)))) 
    {
        free(array);
        return 1;
    }
    array = tmp;
}

You can do this without the tmp pointer and just have array = realloc(array, 2*sizeof(int)))) but that could result in problems later down the road.

于 2012-08-29T19:11:16.723 に答える
0

それを可能にするメモリ マネージャを設計することは可能ですが、一般的に使用されているメモリ マネージャには、このプロパティはありません。独自の mm を作成して、これらの配列に使用できます。

于 2012-08-29T19:06:23.343 に答える
0

reallocを使用します。Realloc はメモリをコピーする可能性がありますが、コピーの問題に対処するために独自のメモリ管理を展開するよりも効率的である可能性があります。

結果のサイズが小さい場合、行儀の良い C ライブラリはコピーしないと言う人もいます。彼らはおそらく正しいです。ただし、私は商用の C ライブラリを使用したり作成したりしていないため、私に関する限り、この主張には根拠がありません。

于 2012-08-29T19:06:37.673 に答える