Malloc / calloc [duplicate] çağrıları aracılığıyla öğeleri ayrı ayrı bellek ayrılmış bir dizinin tamamını nasıl serbest bırakabilirim
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
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ış
N
tamsayı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.
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 x
kı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.