Menu
Coddy logo textTech

Bellek Ayırma Hatasını Kontrol Etme

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

malloc() dinamik bellek tahsisi için güçlü bir araç olsa da anlamanız gereken kritik bir gerçek vardır: malloc() başarısız olabilir. Sistem kullanılabilir belleği tükendiğinde malloc() isteğinizi yerine getiremez ve geçerli bir bellek adresi yerine NULL döndürür.

Bu, malloc() kullandığınız her seferde, döndürülen işaretçiyi kullanmaya çalışmadan önce başarılı olup olmadığını kontrol etmeniz gerektiği anlamına gelir. NULL işaretçi kullanmak, programınızın segmentasyon hatasıyla çökmesine neden olur.

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Programdan çık veya hatayı ele al
}

// Burada ptr kullanmak güvenli
*ptr = 42;

Bu NULL kontrolü isteğe bağlı değildir - sağlam C programları yazmak için gereklidir. Modern sistemlerde bellek ayırma hataları nadir olsa bile, özellikle kaynakları kısıtlı ortamlarda veya büyük miktarlarda bellek istendiğinde meydana gelebilir. Profesyonel C kodu, çökmeleri önlemek ve hataları zarif bir şekilde ele almak için bu kontrolleri her zaman içerir.

challenge icon

Görev

Kolay

Dinamik memory allocation kullanırken uygun error yönetimini gösteren bir C programı yaz. Programın şunları yapması gerekir:

  1. Depolanacak integers sayısını temsil eden bir n integer değerini kullanıcıdan oku
  2. n integers değerinden oluşan bir array için dinamik olarak memory ayırmak üzere sizeof() ile malloc() kullan
  3. Döndürülen pointer'ın NULL olup olmadığını test ederek memory allocation işleminin başarılı olup olmadığını kontrol et
  4. allocation başarısız olursa Memory allocation failed! yazdır ve programı sonlandır
  5. allocation başarılı olursa Memory allocation successful! yazdır
  6. Kullanıcıdan n integer değeri oku ve bunları ayrılan array içinde store et
  7. Tüm değerlerin toplamını hesapla ve şu biçimde yazdır: Sum: [value]
  8. Ayrılan toplam byte sayısını şu biçimde yazdır: Bytes allocated: [value]

malloc() kullanmak için <stdlib.h> başlığını eklemeyi unutma. Programın, ayrılan memory'yi kullanmaya çalışmadan önce allocation failure kontrolü yapma yönündeki temel uygulamayı göstermesi gerekir.

Örneğin girdi şuysa:

4
10 20 30 40

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

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Bu görev, dinamik memory allocation ile çalışırken defensive programming uygulamasının kritik önemini vurgular; böylece programların beklenmedik şekilde çökmek yerine olası memory allocation hatalarını düzgün bir şekilde ele alması sağlanır.

Kendin dene

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

int main() {
    // Tam sayıların sayısını oku
    int n;
    scanf("%d", &n);
    
    // TODO: Kodunu buraya yaz
    // - n tamsayı için bellek ayırmak üzere malloc() kullan
    // - Ayırmanın başarılı olup olmadığını kontrol et
    // - Hem başarı hem de başarısızlık durumlarını ele al
    // - Tam sayıları oku ve sakla
    // - Calculate the sum and bytes allocated
    
    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