Ö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.

  • ???? Sıfırla başlatılan bellek: calloc() fonksiyonu, malloc() fonksiyonunun aksine, ayrılan her baytı sıfıra sıfırlar; malloc() ise öngörülemeyen rastgele değerler bırakır.
  • ???? İki argüman: calloc(n, size) fonksiyonu, belirtilen boyuttaki n bloğu bitişik bir bölgede ayırır.
  • ⚠️ NULL kontrolü: Başarısız bir bellek tahsisi NULL işaretçisi döndürür, bu nedenle kullanmadan önce sonucu doğrulayın.
  • 🆚 calloc ve malloc karşılaştırması: Sıfırlanmış dizileri temizlemek için calloc() işlevini, başlatma işleminden ziyade hızın daha önemli olduğu durumlarda ise malloc() işlevini tercih edin.
  • 🧹 Hafızayı özgür bırakın: Bellek sızıntılarını önlemek için her calloc() bloğunu free() ile serbest bırakın.
  • 🤖 Yapay zeka yardımı: Yapay zeka asistanları ve GitHub Copilot, calloc() çağrılarını taslak haline getiriyor ve eksik free() ifadelerini işaretliyor.

C dilinde calloc() fonksiyonu

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.

SSS

calloc() fonksiyonu standart kütüphane başlık dosyası stdlib.h'de tanımlanmıştır, bu nedenle #include ekleyin. Kaynak dosyasının en üstüne eklenmelidir. Bu olmadan, derleyici örtük bir bildirim konusunda uyarı verebilir ve döndürülen işaretçiyi yanlış okuyabilir.

Bellek yığını isteği karşılayamadığında, `calloc()` geçerli bir adres yerine NULL işaretçisi döndürür. Sonucu kullanmadan önce her zaman NULL ile karşılaştırın, çünkü NULL'a erişmek tanımsız davranışa neden olur ve genellikle programın çökmesine yol açar.

Evet. `calloc()` fonksiyonu, eleman sayısını ve `sizeof(struct)` parametresini geçirerek yapılar ve yapı dizileri de dahil olmak üzere her türle çalışır. Her üye sıfırlanır, bu da manuel başlatma döngüsüne gerek kalmadan temiz bir başlangıç ​​durumu sağlar.

Evet. realloc() fonksiyonu, calloc() veya malloc() tarafından döndürülen herhangi bir işaretçiyi kabul eder ve mevcut verileri koruyarak bloğu büyütür veya küçültür. realloc() tarafından eklenen yeni baytlar sıfırlanmaz, bu nedenle gerekirse bunları kendiniz başlatın.

Sonuç, uygulamaya bağlıdır: calloc() NULL veya referans alınamayan ancak free() fonksiyonuna güvenle geçirilebilen benzersiz bir işaretçi döndürebilir. Her iki sonucu da "kullanılabilir bellek yok" olarak değerlendirin ve bu bellekten okuma yapmaktan kaçının.

`calloc()` fonksiyonu, istenen tüm öğeler için yeterince büyük, sürekli bir bölge ayırır; böylece öğeler dizi hücreleri gibi arka arkaya yerleşir. Adı, bu bitişik, temizlenmiş bloğu yansıtır ve işaretçi aritmetiğinin bellekte güvenilir bir şekilde ilerlemesini sağlar.

Evet. Yapay zekâ kodlama asistanları calloc() çağrılarını taslak haline getirir, NULL kontrolleri ekler, eksik free() çağrılarını veya bellek sızıntılarını işaretler ve işaretçi aritmetiğini açıklar. Üretimde kullanmadan önce oluşturulan kodu her zaman derleyin ve test edin.

GitHub Yardımcı Pilotu Niyetinizi açıklayan bir yorumdan calloc(), sizeof() ve bunlara karşılık gelen free() satırlarını önerir. RevDerlemeden önce eksik NULL kontrolleri ve bellek sızıntılarıyla ilgili her öneriyi inceleyin.

Bu yazıyı şu şekilde özetleyin: