Malloc / calloc [duplicate] çağrıları aracılığıyla öğeleri ayrı ayrı bellek ayrılmış bir dizinin tamamını nasıl serbest bırakabilirim

Aug 16 2020

Bildiğim kadarıyla, malloc ve calloc, API'leri temeldeki bellekte tutuyor. Bunu akılda tutarak, free () 'ye yapılan bir çağrının, bağımsız öğeleri malloc (veya calloc)' a yapılan bağımsız çağrılarla bellek tahsis edilmiş olan tüm bir diziyi serbest bırakıp bırakmayacağını merak ediyorum.

Kesinlikle, aşağıdaki koda sahibim:

int *num,* num_start;

num_start=num;

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

free(num_start);

Olacak free(num_start)dinamik, bağımsız bir şekilde, alan ayrılmış olan, N tamsayı elemanlarının tüm dizi serbest?

Yanıtlar

1 P__JsupportswomeninPoland Aug 16 2020 at 10:09

Gönderdiğiniz "kod" hiçbir anlam ifade etmiyor ve yanlış.

int *num, num_start;
num_start=num;

num_start bir tamsayıdır işaretçi değil.

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

dürüst olmak gerekirse bu kodun ne yapması gerektiğini anlamıyorum, ama kesinlikle yanlış

Ntamsayılar için bellek ayırmak istiyorsanız

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

ve özgürleştirmek için sadece ihtiyacın var

free(num);

Veya N işaretçiyi N tamsayıya depolamak için işaretçi tahsis etmek istiyorsanız

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);
}

Bellek ayırdığınızda, işlemin başarılı olup olmadığını kontrol etmeniz gerekir. Kodun okunmasını kolaylaştırmak için bu kontroller örneğe dahil edilmemiştir.

tadman Aug 16 2020 at 09:55

calloc()Ve malloc()işlevleri bu bellek serbest bırakmak için bir sap olarak da tahsis için bir işaretçi döndürür. Bu işaretçinin kopyalarını yapmakta ve bunları uygun gördüğünüz şekilde değiştirmekte özgürken, sizi aradığınızda free()orijinal değeri sağlamanız gerekir .

Yani bu işe yarıyor:

// 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);

Orijinal varış noktanıza döndüğünüz sürece biraz maceraperest olabilirsiniz:

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

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

free(x);

Buradaki xkısa bir yolculuktan sonra orijinal değerine dönmüştür. Genel uygulamada, daha sonra yeniden yapılandırmak yerine orijinal işaretçiyi korumak daha iyidir. Onları manipüle etmek istiyorsanız kopyalar oluşturun.