ÖRNEK Programla C Kütüphanesindeki calloc() Fonksiyonu
⚡ Akıllı Özet
C dilindeki `calloc()` fonksiyonu, yığında birden fazla bitişik bellek bloğu ayırır ve her baytı sıfıra başlatarak, programların çalışma zamanında temiz, kullanıma hazır diziler ve veri yapıları oluşturmasına olanak tanıyan bir void işaretçisi döndürür.
C'de calloc nedir?
C dilindeki `calloc()` fonksiyonu, aynı boyutta birden fazla bellek bloğu ayırmak için kullanılır. Diziler ve yapılar gibi karmaşık veri yapılarına bellek alanı ayıran ve belleğe bir void işaretçisi döndüren dinamik bir bellek ayırma fonksiyonudur. `calloc`, "bitişik bellek ayırma" anlamına gelir.
Malloc işlevi tek bir bellek alanı bloğu tahsis etmek için kullanılırken, C'deki calloc işlevi birden fazla bellek alanı bloğunu tahsis etmek için kullanılır. C programlamada calloc tarafından ayrılan her blok aynı boyuttadır.
C dilinde calloc() neden kullanılır?
Sıradan değişkenler ve sabit boyutlu diziler, program derlenirken boyutlarını kilitler; bu da daha az eleman gerektiğinde alan israfına yol açar ve daha fazla eleman gerektiğinde tamamen başarısız olur. `calloc()` bu sınırlamayı ortadan kaldırarak çalışma zamanında bellek ayırır ve `malloc()`'un aksine, bloğu geri vermeden önce her baytı sıfırlar. Bu, bir programın yalnızca kod çalışırken boyutu bilinen bir dizi veya yapı için temiz, tahmin edilebilir bir bellek alanı gerektiğinde `calloc()`'u doğal bir seçim haline getirir.
calloc() ile dinamik bellek tahsisi, çeşitli yaygın durumlara uygundur:
- Sayaçlar, histogramlar veya ardışık biriktiriciler gibi sıfırdan başlaması gereken sayısal diziler.
- Artık değerlerin ince, anlaşılması zor sorunlara yol açabileceği veri yapılarıtracve böcekler.
- BufferUzunluğu, program çalışırken kullanıcı girdisine veya okunan bir dosyaya bağlı olan değişkenler.
- calloc() fonksiyonu çok daha büyük olan yığından veri çektiği için, bloklar sınırlı yığın için çok büyük.
Ayrılan blok bitişik ve zaten sıfırlanmış olduğundan, ayrı bir başlatma döngüsüne gerek kalmadan hemen kullanıma hazır bir dizi olarak ele alınabilir.
calloc() Sözdizimi:
ptr = (cast_type *) calloc (n, size);
- C'deki yukarıdaki calloc ifadesi 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.
- MKS işaretçi şu anda tahsis edilen hafıza alanının ilk baytında bulunan değer döndürülür.
Bellek yetersizliği gibi bellek alanı tahsisinde bir hata olduğunda, aşağıdaki calloc örneğinde gösterildiği gibi bir boş gösterici döndürülür.
calloc nasıl kullanılır
C dilindeki aşağıdaki calloc programı bir aritmetik dizinin toplamını hesaplar.
#include <stdio.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; }
C örneğindeki calloc'un sonucu:
Building and calculating the sequence sum of the first 10 terms
Sum = 45
calloc() ve malloc() Arasındaki Fark
calloc() ve malloc() fonksiyonlarının her ikisi de yığında bellek ayırır ve her ikisi de void işaretçisi döndürür veya başarısızlık durumunda NULL döndürür; ancak hangisinin kullanılacağına karar vermeyi gerektiren üç pratik açıdan farklılık gösterirler.
- Başlatma: calloc() yeni bloktaki her baytı sıfıra ayarlar, malloc() ise içeriği başlatılmamış halde bırakır; bu nedenle bir malloc() bloğu, program ona yazana kadar tahmin edilemeyen çöp veriler içerir.
- Argümanlar: calloc() iki argüman alır, eleman sayısı ve her birinin boyutu, calloc(n, size) şeklinde yazılır; malloc() tek bir argüman alır, toplam bayt sayısı, malloc(n * size) şeklinde yazılır.
- Hız: malloc() sıfırlama adımını atladığı için biraz daha hızlıdır; bu nedenle belleği hemen üzerine yazan kodlar genellikle onu tercih eder.
Her iki fonksiyon da stdlib.h dosyasında tanımlanmıştır ve her ikisi de belleklerini aynı free() fonksiyonuyla serbest bırakır. Temiz, sıfırlanmış bir blok önemli olduğunda calloc(), ham hız tercih edildiğinde ve program başlatmayı kendisi hallettiğinde ise malloc() tercih edin.
calloc() ile ayrılan belleği nasıl serbest bırakabilirim?
`calloc()` 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, sistemin kullanabileceği alanı yeniden kullanabilmesi için sisteme tamamlanmış bir bellek bloğu döndürür.
`free()` fonksiyonu, `calloc()` 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 = calloc(10, sizeof(int)); if (ptr != NULL) { /* use the allocated memory here */ free(ptr); /* release the block */ ptr = NULL; /* avoid a dangling pointer */ }
calloc() fonksiyonunun bellek yönetimini güvenli bir şekilde gerçekleştirmek için şu kurallara uyun:
- Her başarılı calloc() işlemi için free() işlevini 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.
- calloc() 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 tahsisi bir serbest bırakma işlemiyle eşleştirin.
Çünkü calloc() ve malloc() fonksiyonları aynı yığından bellek çekerler, bu nedenle her iki fonksiyon için de serbest bırakma disiplini aynıdır: her başarılı tahsis için bir free() çağrısı yapılır ve sonrasında bloğa erişim olmaz. Keeping C dilinde manuel bellek yönetiminin temel alışkanlığı, bellek tahsisi ve serbest bırakılmasının dengeli bir şekilde yapılmasıdır ve bu, hem bellek sızıntılarını hem de daha önce geri verilmiş belleğin yeniden kullanılmasından kaynaklanan çökmeleri önler.

