-1

配列を安全に解放する必要がchar** a;あります。これは文字列リストのようなものです。中に何人いるか知ってchar*います。しかし、すべてのメモリを解放するのに苦労しています。20 バイトを解放するために使用できる関数のようなものはありますか? 私は試した:

for (int i = 0; i < length; i++)
    if (a[i] != null)
        free(a[i]); // some of a[i] ARE null, non-null have different sizes
free(a); // crashes here

asmしかし、デバッグで実行時エラーが発生します。a 内のすべてが malloc されています。私は5つの文字列をmallocedしました(各ポインタは4バイト)-> 20バイト。どうすれば全体を解放できchar**ますか?

4

3 に答える 3

6

20 バイトを割り当てない限り、20 バイトを解放することはできません。ブロックのみを解放できます。そのブロックのサイズは割り当て時に指定されます。割り当てられたブロックごとに、個別の割り当て解除が必要です。

を使用してブロックのサイズを変更しようとすることはできますが、reallocそれはそのブロックの任意の部分を削除することではありません。

配列と配列内の個々のアイテムの両方が を使用して割り当てられているmalloc場合、アプローチは正しいです。各要素を解放してから、配列を解放します。

char **arr = malloc (10 * sizeof (char*));
if (arr != NULL)
    for (int i = 0; i < 10; i++)
        arr[i] = malloc (50 + i * 10); // sizes 50, 60, 70, ..., 140

// Use the ten X-character arrays here
//     (other than NULL ones from malloc failures, of course).

if (arr != NULL) {
    for (int i = 0; i < 10; i++)
        free (arr[i]);           // Okay to free (NULL), size doesn't matter
    free (arr);
}
于 2013-01-29T07:40:26.340 に答える
1

投稿したコードに問題はありません。ただし、同じメモリを2回解放すると、ランタイムエラーが発生する可能性があります。コードの残りの部分をチェックして、実際にその配列内のすべてのメモリを割り当てており、2回以上解放していないことを確認してください。

于 2013-01-29T07:55:43.260 に答える
1

char** 配列とそれに含まれるすべての char* 配列を適切に割り当てていれば、投稿したコードは機能するはずです。コードの残りの部分はどのように見えますか?

于 2013-01-29T07:41:15.467 に答える