malloc / calloc [duplicate]の呼び出しを介して、要素に個別にメモリが割り当てられている配列全体を解放するにはどうすればよいですか。

Aug 16 2020

私の知る限り、mallocとcallocは、基盤となるメモリにAPIを保持する単なる簿記です。これを念頭に置いて、free()を呼び出すと、malloc(またはcalloc)への独立した呼び出しによって個々の要素にメモリが割り当てられている配列全体が解放されるのではないかと思います。

正確には、私は次のコードを持っています:

int *num,* num_start;

num_start=num;

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}

free(num_start);

ウィルfree(num_start)独立して、動的にスペースが割り当てられている要素、整数Nの配列全体を解放?

回答

1 P__JsupportswomeninPoland Aug 16 2020 at 10:09

あなたが投稿した「コード」は意味がなく、間違っています。

int *num, num_start;
num_start=num;

num_startは、ポインタではなく整数です。

for(i=0;i<N;i++)
{
    num = (int *)calloc(0, sizeof(int));
    num++;
}

正直なところ、このコードが何をするのかわかりませんが、確かに間違っています

N整数にメモリを割り当てたい場合

int *num = calloc(N, sizeof(*num));

解放するには必要なのは

free(num);

または、N個の整数へのN個のポインタを格納するためにポインタを割り当てたい場合

int **allocate(size_t N)
{
    int **num = malloc(N * sizeof(*num));
    for(size_t i=0; i<N; i++)
    {
        num[i] = calloc(N, sizeof(**num));
    }
    return num;
}

void arrayfree(int **num, size_t size)
{
    for(size_t i = 0; i < size; i++)
    {
        free(num[i]);
    }
    free(num);
}

メモリを割り当てるときは、操作が成功したかどうかを確認する必要があります。これらのチェックは、コードを読みやすくするために例に含まれていません。

tadman Aug 16 2020 at 09:55

calloc()そしてmalloc()関数は、メモリを解放するためのハンドルを兼ね割り当てへのポインタを返します。そのポインタのコピーを自由に作成し、必要に応じてそれらを操作できますが、呼び出すときfree()は元のを指定する必要があります

つまり、これは機能します。

// Original allocation
int* x = calloc(42, sizeof(int));

// Making a new (independent) copy of the pointer to a new pointer
int* p = x;

// Arbitrary pointer manipulation and mangling
x++;

// Freeing with the copied value
free(p);

元の目的地に戻る限り、少し冒険することもできます。

int* x = calloc(42, sizeof(int));

x += 40;
x -= 30;
x += 10;
x -= 13;
x -= 7;

free(x);

ここxは短い旅の後に元の値に戻ったところです。一般的には、後で再構築するよりも、元のポインタを保持する方が適切です。それらを操作するつもりなら、コピーを作成してください。