Menu
Coddy logo textTech

calloc() ile Bellek Ayırma

Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 36 / 63.

malloc() dinamik bellek ayırma için en yaygın işlev olsa da C, başka bir kullanışlı seçenek daha sunar: calloc(). “Contiguous allocation” ifadesinin kısaltması olan calloc() işlevi, önemli bir ek avantajla diziler için bellek ayırmanın kullanışlı bir yolunu sunar.

Tek bir argüman (toplam bayt) alan malloc() fonksiyonunun aksine, calloc() iki argüman alır: tahsis etmek istediğiniz eleman sayısı ve her bir elemanın boyutu. Bu, özellikle dizilerle çalışırken onu sezgisel hale getirir. Örneğin:

#include <stdlib.h>

// calloc() kullanarak 5 tam sayı için yer ayırın
int *arr = (int*)calloc(5, sizeof(int));

// Bu şuna eşdeğerdir: malloc(5 * sizeof(int))

calloc() fonksiyonunun temel avantajı, ayrılan tüm belleği otomatik olarak sıfıra ilklendirmesidir. malloc() kullandığınızda, ayrılan bellek daha önce orada saklanan rastgele değerleri içerir, ancak calloc() her baytın sıfıra ayarlanmasını garanti eder. Bu, tüm tamsayıların 0, tüm kayan noktalı sayıların 0.0 ve tüm işaretçilerin NULL olacağı anlamına gelir.

malloc() gibi, calloc() da ayrılan belleğe bir işaretçi döndürür veya ayırma başarısız olursa NULL döndürür; bu nedenle her zaman ayırma hatasını kontrol etmeli ve kullanmayı bitirdiğinizde belleği free() etmeyi unutmamalısınız.

challenge icon

Görev

Kolay

calloc() kullanarak otomatik sıfır başlatma ile dinamik bellek ayırmayı gösteren bir C programı yazın. Programınız şunları yapmalıdır:

  1. Kullanıcıdan, ayrılacak tamsayı sayısını temsil eden bir size tamsayısı okuyun
  2. calloc() adet tamsayıdan oluşan bir dizi için dinamik olarak bellek ayırmak üzere size kullanın
  3. Bellek ayırma işleminin başarılı olup olmadığını kontrol edin - başarısız olursa Memory allocation failed! yazdırın ve programı sonlandırın
  4. Bellek ayırma başarılı olursa Memory allocated and initialized to zero! yazdırın
  5. Sıfır olduklarını göstermek için dizideki tüm başlangıç değerlerini şu biçimde yazdırın: Initial values: [value1] [value2] [value3] ...
  6. Kullanıcıdan size adet tamsayı değeri okuyun ve bunları ayrılan diziye kaydedin
  7. Güncellenmiş tüm değerleri şu biçimde yazdırın: Updated values: [value1] [value2] [value3] ...
  8. Tüm değerlerin toplamını hesaplayın ve şu biçimde yazdırın: Sum: [value]
  9. Belleği serbest bırakmak için free() kullanın
  10. Temizleme işlemini doğrulamak için Memory freed! yazdırın

<stdlib.h> ve calloc() kullanmak için free() başlığını eklemeyi unutmayın. Bu görev, calloc() işlevinin malloc() karşısındaki temel avantajını gösterir: ayrılan belleğin tamamının otomatik olarak sıfırla başlatılması.

Örneğin, girdi şu şekildeyse:

3
10 20 30

Çıktınız şu şekilde olmalıdır:

Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!

Bu görev, calloc() işlevinin dinamik olarak ayrılan dizileriniz için nasıl temiz ve öngörülebilir bir başlangıç durumu sağladığını, malloc() işlevinin geride bırakabileceği öngörülemeyen çöp değerleri ortadan kaldırarak gösterir.

Kendin dene

#include <stdio.h>
#include <stdlib.h>

int main() {
    int size;
    
    // Dizinin boyutunu oku
    scanf("%d", &size);
    
    // TODO: Kodunuzu aşağıya yazın
    // Dizi için bellek ayırmak üzere calloc() kullanın
    // Bellek ayırma işleminin başarılı olup olmadığını kontrol edin
    // Başlangıç değerlerini yazdırın (sıfır olmalı)
    // Giriş değerlerini okuyun ve saklayın
    // Güncellenmiş değerleri yazdırın
    // Toplamı hesaplayın ve yazdırın
    // Ayrılan belleği serbest bırakın
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık & Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi