EXAMPLE ile C kütüphanesindeki malloc() Fonksiyonu
⚡ Akıllı Özet
C dilindeki `malloc()` fonksiyonu, çalışma zamanında yığın bellekte bir bellek bloğu ayırır ve ilk baytına işaret eden bir void işaretçisi döndürür; bu sayede programlar, kod gerçekten yürütülene kadar boyutu bilinmeyen bir depolama alanı talep edebilir.

C'deki malloc nedir?
Malloc() işlevi bellek ayırma anlamına gelir. 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.
Sözdizimi
ptr = (cast_type *) malloc (byte_size);
Burada,
- ptr, cast_type'ın 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.
Malloc uygulamasının başka bir örneğini düşünün:
#include <stdlib.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */ if (ptr != NULL) { *(ptr + 5) = 480; /* assign 480 to sixth integer */ printf("Value of the 6th integer is %d",*(ptr + 5)); } }
Çıktı:
Value of the 6th integer is 480
*ptr bildiriminin daha sonra farklı bir veri türüne dönüştürülmesi durumunda kodun daha sağlam olması için sizeof(int) yerine sizeof(*ptr) kullanıldığına dikkat edin.
Bellek yeterli değilse ayırma başarısız olabilir. Bu durumda NULL işaretçisi döndürür. Bu nedenle, NULL işaretçisini kontrol etmek için kod eklemelisiniz.
Tahsis edilen belleğin bitişik olduğunu ve bir dizi olarak ele alınabileceğini unutmayın. Bunu şu şekilde kullanabiliriz: işaretçi Köşeli parantezler [ ] yerine dizi elemanlarına erişmek için + operatörünü kullanmanızı öneririz. Artırma işlemi ++ veya += kullanmak işaretçinin sakladığı adresi değiştirdiği için dizi elemanlarına + operatörünü kullanmanızı tavsiye ederiz.
Malloc fonksiyonu karakter veri tipinin yanı sıra yapılar gibi karmaşık veri tipleriyle de kullanılabilir.
C dilinde malloc() neden kullanılır?
Statik diziler ve sıradan değişkenler, program derlendiğinde boyutlarını sabitler; bu da gereksinim daha küçük olduğunda yer israfına, daha büyük olduğunda ise tamamen başarısızlığa yol açar. `malloc()` bu sorunu çalışma zamanında bellek talep ederek çözer, böylece bir program aldığı veri miktarına tam olarak uyacak şekilde bir arabellek boyutlandırabilir. Bu çalışma zamanı esnekliği, `malloc()`'un kalbinde yer alır. dinamik bellek ayırma C cinsinden
malloc() ile dinamik bellek tahsisi, birçok yaygın durumda doğru tercihtir:
- Dosya okuma veya kullanıcı tarafından sağlanan liste okuma gibi işlemlerde, program çalışana kadar girdi miktarı bilinmez.
- malloc() çok daha büyük olan yığından veri çektiği için, sınırlı yığını aşacak kadar büyük bloklara ihtiyaç duyulur.
- Verinin, onu oluşturan fonksiyondan daha uzun süre varlığını sürdürmesi gerekir, çünkü yığın belleği açıkça serbest bırakılana kadar varlığını sürdürür.
- Program çalışırken yapılar ve dizilerin büyümesi veya küçülmesi gerekir.
Ayrılan blok bir işaretçi olarak geri verildiği için, temel verileri kopyalamaya gerek kalmadan fonksiyonlar arasında kolayca aktarılabilir.
malloc() ile ayrılan belleği nasıl serbest bırakabilirim?
`malloc()` fonksiyonu tarafından ayrılan bellek, yığın üzerinde bulunur ve asla otomatik olarak serbest bırakılmaz. Bir program serbest bırakmadan sürekli bellek ayırdığında, yavaş yavaş mevcut tüm belleği tüketir; bu durum bellek sızıntısı olarak bilinir. `free()` fonksiyonu, alanın yeniden kullanılabilmesi için sisteme bitmiş bir bellek bloğu döndürür.
`free()` fonksiyonu, `malloc()` fonksiyonunun döndürdüğü işaretçiyi tek bir argüman olarak alır ve tüm bloğu bir kerede serbest bırakır:
int *ptr; ptr = malloc(10 * sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
Dinamik belleği güvenli bir şekilde yönetmek için şu kurallara uyun:
- Her başarılı malloc() işlemi için free() fonksiyonunu tam olarak bir kez çağırın; aynı bloğu iki kez serbest bırakmak tanımsız davranışa neden olur.
- Serbest bırakıldıktan sonra işaretçiyi NULL olarak ayarlayın, böylece geçersiz bir işaretçi olarak tekrar kullanılamaz.
- malloc() tarafından döndürülmeyen bir işaretçiyi, işaretçi aritmetiğiyle kaydırılmış bir işaretçi de dahil olmak üzere, asla free() etmeyin.
- İşaretçi kapsam dışına çıkmadan önce her tahsis işlemine karşılık gelen bir serbest bırakma işlemi gerçekleştirin.
Keeping C dilinde manuel bellek yönetiminin temel prensibi, bellek tahsisi ve serbest bırakılmasının dengeli bir şekilde yapılmasıdır ve bu, serbest bırakılan belleğin yeniden kullanılmasından kaynaklanan bellek sızıntılarını ve çökmeleri önler.
malloc() ve calloc() arasındaki temel farklar
malloc() ve kalloc() Her ikisi de yığın belleği ayırır, ancak argümanları ve yeni bloğu nasıl ele aldıkları bakımından farklılık gösterirler. malloc() tek bir argüman alır, toplam bayt sayısı, ve içeriği başlatılmamış bırakır, bu nedenle blok, program ona yazana kadar tahmin edilemeyen çöp değerler içerir. calloc() iki argüman alır, eleman sayısı ve her birinin boyutu, ve işaretçiyi döndürmeden önce her baytı sıfıra temizler.
Pratik farklılıklar üç noktaya indirgenebilir:
- Başlangıç: calloc() belleği sıfırlarken, malloc() sıfırlamaz; bu da değerler zaten üzerine yazılacaksa malloc()'u biraz daha hızlı hale getirir.
- Tartışma konusu: malloc(n * size) yazarsınız ancak aynı diziyi ayırmak için calloc(n, size) yazarsınız.
- Kullanım örneği: Temiz ve sıfırlanmış bir blok önemli olduğunda calloc(), hız tercih edildiğinde ve başlatma işlemi manuel olarak yapıldığında ise malloc() tercih edilir.
Her iki fonksiyon da stdlib.h dosyasında tanımlanmıştır, her ikisi de başarısızlık durumunda void işaretçi veya NULL döndürür ve her ikisi de belleklerini aynı free() fonksiyonuyla geri verir.

