Malloc (), calloc (), free () ve realloc () kullanarak C Dinamik Bellek Tahsisi

Bu eğitimde, standart kütüphane işlevlerini kullanarak C programınızda dinamik olarak bellek ayırmayı öğreneceksiniz: malloc (), calloc (), free () ve realloc ().

Bildiğiniz gibi, dizi sabit sayıda değerden oluşan bir koleksiyondur. Bir dizinin boyutu bildirildikten sonra onu değiştiremezsiniz.

Bazen beyan ettiğiniz dizinin boyutu yetersiz olabilir. Bu sorunu çözmek için, çalıştırma sırasında manuel olarak bellek ayırabilirsiniz. Bu, C programlamada dinamik bellek tahsisi olarak bilinir.

Dinamik bellek ayırma için, kütüphane fonksiyonları malloc(), calloc(), realloc()ve free()kullanılmaktadır. Bu işlevler başlık dosyasında tanımlanmıştır .

C malloc ()

"Malloc" adı, bellek tahsisini ifade eder.

malloc()İşlev bayt belirtilen sayıda bellek bloğunu tutar. Ve voidherhangi bir biçimde işaretçi haline getirilebilen bir işaretçi döndürür .

Malloc sözdizimi ()

 ptr = (castType*) malloc(size);

Misal

 ptr = (float*) malloc(100 * sizeof(float));

Yukarıdaki ifade 400 bayt bellek ayırır. Bunun nedeni, boyutunun float4 bayt olmasıdır. Ve ptr işaretçisi, ayrılmış bellekteki ilk baytın adresini tutar.

NULLBellek ayrılamazsa ifade bir işaretçi ile sonuçlanır .

C calloc ()

"Calloc" adı, bitişik tahsis anlamına gelir.

malloc()Fonksiyon ayırır bellek ve yapraklar bellek başlatılmamış. Oysa calloc()işlev bellek ayırır ve tüm bitleri sıfıra başlatır.

Calloc sözdizimi ()

 ptr = (castType*)calloc(n, size);

Misal:

 ptr = (float*) calloc(25, sizeof(float));

Yukarıdaki ifade, bellekte 25 öğe türü için bitişik alan ayırır float.

C ücretsiz ()

Dinamik olarak ayrılmış bellek, biriyle yaratılır calloc()veya malloc()kendiliğinden serbest bırakılmaz. free()Alanı serbest bırakmak için açıkça kullanmalısınız .

Ücretsiz sözdizimi ()

 free(ptr);

Bu ifade, işaret edilen bellekte ayrılan alanı serbest bırakır ptr.

Örnek 1: malloc () ve free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Burada hafızayı n adet için dinamik olarak ayırdık int.

Örnek 2: calloc () ve free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

Dinamik olarak ayrılan bellek yetersiz veya gerekenden fazlaysa, realloc()işlevi kullanarak önceden ayrılmış belleğin boyutunu değiştirebilirsiniz .

Realloc () sözdizimi

 ptr = realloc(ptr, x);

Burada ptr, yeni bir x boyutuyla yeniden tahsis edilir.

Örnek 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Programı çalıştırdığınızda, çıktı:

 Boyutu girin: 2 Önceden ayrılmış belleğin adresi: 26855472 26855476 Yeni boyutu girin: 4 Yeni ayrılan belleğin adresi: 26855472 26855476 26855480 26855484

Ilginç makaleler...