Malloc() ve calloc() arasındaki fark
Malloc() ile calloc() arasındaki temel farklar
- Malloc() fonksiyonu sadece başlangıç adresini döndürür ve onu sıfır yapmaz, buna karşın calloc() fonksiyonu ise başlangıç adresini döndürür ve onu sıfır yapar.
- Malloc fonksiyonunda argüman sayısı 1, calloc fonksiyonunda ise argüman sayısı 2'dir.
- malloc() zaman verimliliği calloc()'tan daha yüksektir, oysa malloc() calloc() ile karşılaştırıldığında güvenli değildir
- Malloc belleği başlatmaz, oysa calloc belleğin başlatılmasını gerçekleştirir.

Dinamik Bellek Ayırma Nedir?
Dinamik bellek ayırma çalışma zamanında bellek ayırma işlemidir. Dört kütüphane rutini vardır, calloc(), free(), realloc()ve malloc() hafızayı tahsis etmek ve programın yürütülmesi sırasında hafızayı boşaltmak için kullanılabilir. Bu rutinler stdlib.h adlı başlık dosyasında tanımlanır.
Malloc() nedir?
Bir bellek bloğunu dinamik olarak tahsis etmek için kullanılan bir fonksiyondur. Belirtilen boyutta bellek alanı ayırır ve bellek konumunu gösteren boş işaretçiyi döndürür.
Döndürülen işaretçi genellikle void türündedir. Bu, herhangi bir işaretçiye malloc fonksiyonunu atayabileceğimiz anlamına gelir. Malloc'un tam biçimi bellek ayırmadır.
calloc() nedir?
Calloc() işlevi birden fazla bellek bloğunu tahsis etmek için kullanılır. Diziler ve yapılar gibi karmaşık veri yapılarına bellek tahsis etmek için kullanılan dinamik bir bellek tahsis fonksiyonudur. Bu fonksiyon belirtildiği gibi yeterli alan tahsis edemezse, null işaretçisi döndürür. calloc fonksiyonunun tam biçimi bitişik tahsistir.
Malloc() ve calloc() arasındaki fark
Malloc() ve calloc() arasındaki önemli farklar şunlardır:
malloc () | kalloc() |
---|---|
Malloc() işlevi, kullanıcı tarafından belirlenen boyutta tek bir bellek bloğu oluşturacaktır. | Calloc() işlevi bir değişkene birden fazla bellek bloğu atayabilir. |
Malloc işlevi çöp değeri içeriyor. | Bir calloc işlevi tarafından ayrılan bellek bloğu her zaman sıfır olarak başlatılır. |
Argüman sayısı 1'dir. | Argüman sayısı 2'dir. |
Calloc malloc'tan daha yavaştır. | Malloc, calloc'tan daha hızlıdır. |
Calloc ile karşılaştırıldığında güvenli değil. | Malloc'a kıyasla kullanımı güvenlidir. |
Zaman verimliliği calloc()'tan daha yüksektir. | Zaman verimliliği malloc()'tan daha düşüktür. |
Malloc() işlevi yalnızca başlangıç adresini döndürür ve onu sıfır yapmaz. | Adresi tahsis etmeden önce Calloc() fonksiyonu başlangıç adresini döndürür ve onu sıfır yapar. |
Belleğin başlatılmasını gerçekleştirmez. | Bellek başlatma işlemini gerçekleştirir. |
Malloc()'un sözdizimi
İşte malloc()'un sözdizimi
ptr = (cast_type *) malloc (byte_size);
Yukarıdaki sözdiziminde ptr, cast_type'in bir işaretçisidir. Malloc işlevi, ayrılmış byte_size belleğine bir işaretçi döndürür.
Example: ptr = (int *) malloc (50)
Bu ifade başarıyla yürütüldüğünde 50 baytlık bir bellek alanı ayrılır. Ayrılmış alanın ilk baytının adresi int tipindeki “ptr” işaretçisine atanır.
calloc()'un sözdizimi
İşte malloc()'un sözdizimi
ptr = (cast_type *) calloc (n, size);
Yukarıdaki sözdizimi aynı boyuttaki n adet bellek bloğunu tahsis etmek için kullanılır. Bellek alanı tahsis edildikten sonra tüm baytlar sıfıra ayarlanır. Şu anda ayrılmış bellek alanının ilk baytında bulunan işaretçi döndürülür.
C'deki malloc() örneği
Aşağıdaki kodda sizeof(*ptr) 15 tam sayıdan oluşan bir bellek bloğunu tahsis etmek için kullanılır. Printf deyiminde 6. tam sayının değerini buluyoruz.
#include<stdlib.h> #include<stdio.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); if (ptr != NULL) { *(ptr + 5) = 480; printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Çıktı:
6. tam sayının değeri 480
C'deki calloc() örneği
Aşağıdaki C dili programı ilk on terimin toplamını hesaplar. İşaretçi değeri boşsa, bellek alanı tahsis edilmeyecektir.
For döngüsü, “i” değişkeninin değerini yinelemek ve toplamı yazdırmak için kullanılır. Son olarak, işaretçiyi serbest bırakmak için free işlevi kullanılır.
#include <stdio.h> #include <stdlib.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \n"); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
Çıktı:
İlk 10 terimin dizi toplamının oluşturulması ve hesaplanması n Toplam = 45
Neden malloc() kullanıyorsunuz?
Malloc() kullanmanın nedenleri şunlardır:
- Çalışma zamanında bellek ayırmanız gerektiğinde malloc() işlevini kullanmalısınız.
- Geçerli bellek bloğunun yürütülmesinin ötesinde var olması gereken nesneleri ayırmanız gerektiğinde malloc kullanmalısınız.
- Bu yığının boyutundan daha büyük bir bellek ayırmanız gerekiyorsa malloc()'a gidin.
- İşaretçiyi ayrılan alanın ilk baytına döndürür.
- Geliştiricilerin, tam olarak ihtiyaç duyulan miktarda bellek ayırmasına olanak tanır.
- Bu işlev yığından bayt boyutunda bir bellek bloğu ayırır.
Neden calloc() kullanıyorsunuz?
İşte calloc() kullanmanın nedenleri:
- Ayrılmış belleği sıfıra ayarlamanız gerektiğinde.
- Bellek yığınına erişim sağlamak için bir işaretçi döndüren calloc'u kullanabilirsiniz.
- Belleğe bir işaretçi döndürmek için öğeleri sıfıra başlatmanız gerektiğinde kullanılır.
- Malloc() ile mümkün olan taşmayı önlemek için
- Halihazırda sıfırlandığı bilinen bir sayfayı istemek için calloc() işlevini kullanın.