Malloc () ve calloc () fonksiyonlarını anlamadan önce dinamik hafıza tahsisinin anlamını anlamamızı sağlayın. Bellek ayırma, programların ve işlemlerin yürütülmesi için bilgisayar belleği atama prosedürüdür. Program ve süreç için ne kadar hafıza alanına ihtiyaç duyulduğunun bilinmediği durumlarda dinamik ayırma tekniklerini kullanıyoruz.
Dinamik bellek tahsisi, daha az elemanın depolanması gibi statik bellek tahsisi ile ilgili problemlerden kaynaklanır, daha sonra belleğin geri kalanı gereksiz yere boşa harcanır. Bu nedenle, sadece gerektiğinde belleğin ayrıldığı statik bellek tahsisi problemlerinin üstesinden gelir.
Karşılaştırma Tablosu
Karşılaştırma temeli | Malloc () | calloc () |
---|---|---|
Blok sayısı | Tek bir istenen bellek bloğu atar. | İstenen hafızanın birden fazla bloğunu atar. |
Sözdizimi | void * malloc (size_t size); | void * calloc (size_t num, size_t boyut); |
Başlatma | malloc (), ayrılan hafızayı silmez ve başlatmaz. | Tahsis edilen hafıza calloc () kullanılarak sıfıra başlatılır. |
Tahsisat Şekli | malloc () işlevi 'size' boyutundaki belleği yığından ayırır. | calloc () işlevi, boyutu num * boyutuna eşit olan belleği ayırır. |
hız | Hızlı | Nispeten yavaş. |
Malloc'un tanımı ()
Malloc işlevi bayt olarak bir bellek bloğu atar. Kullanıcı açıkça blok boyutunu vermelidir, kullanımı gerekir.
Malloc fonksiyon programı sayesinde, eğer talep kabul edilirse (yani, malloc fonksiyonu hafıza tahsis etmede başarılı olduğunu söylüyor) hafızanın tahsisi için sistemin RAM'ını talep eder, ilk hafıza bloğuna bir gösterici ile döner. Boş işaretçi türünü döndürür, yani herhangi bir işaretçi türünün atanabileceği anlamına gelir.
Bununla birlikte, malloc işlevleri gerekli bellek miktarını ayıramadığında NULL döndürür. alloc.h
işlevi TURBO C’de, başlık dosyas alloc.h
veya stdlib.h
erişilebilir ve UNIX’de başlık dosyasında .
SÖZDİZİMİ
Bu işlevin sözdizimi aşağıdaki gibidir:
malloc(number of elements * size of each element);
Örneğin, int *ptr;
ptr=malloc(10*sizeof (int))
Büyüklüğün, bayt cinsinden gereken belleğin boyutunu temsil ettiği durumlarda (yani, ayrılacak olan bitişik bellek konumlarının sayısı).
Ancak, malloc fonksiyonunun geçersiz bir işaretçi döndürdüğü daha önce belirtildiği gibi, sonuçta ihtiyacımıza bağlı olarak iade edilen işaretçi tipini değiştirmek için bir döküm operatörü gerekir, yukarıdaki bildirim aşağıdaki şekilde sunulabilir:
ptr_var=(type_cast* ) malloc (size)
ptr_var
, ayrılmış bellek bloğunun başlangıç adresini tutan işaretçinin adı ise, type_cast
, döndürülen işaretçinin (veya void tipinin) dönüştürüleceği veri türüdür ve boyut, ayrılmış bellek bloğunun bayt cinsinden boyutunu belirtir. .
Örneğin: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Malloc işlevi tarafından ayrılan bellek , çöp değeri içerir .
Karşılık gelen talebin, sistem RAM tarafından verilen belleği tahsis etmek için malloc tarafından üretilip üretilmediğini veya reddedildiğini doğrulamak için (gerekli boş alan yoksa) unutmayın. Gerekli miktarda bellek atanmamış malloc işlevinin NULL döndürdüğü özelliği kullanabiliriz.
Calloc'un tanımı ()
Calloc işlevi, malloc () durumunda olduğu gibi iki argüman gerektirdiği gerçeği hariç, malloc işlevi ile tam olarak aynı şekilde çalışır.
Örneğin: int*ptr;
ptr = (int*)calloc(10, 2);
Burada 2, tahsisin yapılmasını istediğimiz bayttaki veri tipinin boyutunu belirtir, bu durumda tamsayılar 2'dir. Ve 10, tahsisat yapılacak elemanların sayısını ifade eder.
Unutma malloc işlevine iletilen argümanın (n * 10) olduğunu hatırlayın, tek bir argüman karıştırılmaz çünkü çoklu argümanlar her zaman virgüllerle ayrılır. Argüman (n * 10) arasında virgül yoktur. Dolayısıyla, basit bir ifade değil, ifade olan tek bir argümandır.
Yukarıdaki bildirime geri dönersek, yukarıdaki ifadenin uygulanmasını takiben, talep eden programa 20 baytlık bir bellek bloğu tahsis edilir ve talep edilen programa birinci bloğun adresi talep edilen programa atanır ve ilk bloğun adresi işaretçiye atanır ptr.
Calloc işlevi tarafından ayrılan bellek tüm sıfırları tutar. Calloc işlevi başlık dosyasında da elde edilebilir veya
TURBO C.
Malloc ve calloc Arasındaki Temel Farklar
Malloc ve calloc fonksiyonları arasındaki birincil farklar:
- Talep edilen hafızanın tek bir bloğu malloc'a atanırken, istenen hafızanın çoklu blokları calloc tarafından tahsis edilir.
- Malloc işlevi ayrılmış belleği temizlemez ve başlatır. Çöp değerini içerir ve ayrılan hafızanın maddesi değiştirilemez. Buna karşılık, calloc, ayrılmış belleği sıfıra başlatır.
- Malloc calloc'ta ek başlatma adımlarının gerekliliği nedeniyle calloc'tan daha hızlıdır ancak fark önemsizdir.
- Bu ikisi arasındaki bir başka fark da, calloc'un bir malloc + memset olmasıdır, memset fiziksel sayfaları hafızaya tahsis eder, malloc ise hafızayı sadece sanal adresdeki öbekten atar.
Sonuç:
Hem malloc hem de calloc fonksiyonları hafızanın tahsisi için kullanılır ve belirli avantajları vardır ve malloc gibi dezavantajları calloc'a kıyasla daha hızlıdır. Dahası, malloc kullanımı tek bir argüman olduğu için kullanımı daha kolaydır çünkü calloc belleği ayırır ve bellek alanını SIFIR ile başlatır. Fakat değişken başlatma sizin için daha önemliyse calloc kullanmayı tercih edersiniz.