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.
Görev
KolayDinamik memory allocation kullanırken uygun error yönetimini gösteren bir C programı yaz. Programın şunları yapması gerekir:
- Depolanacak
integerssayısını temsil eden birnintegerdeğerini kullanıcıdan oku nintegersdeğerinden oluşan birarrayiçin dinamik olarakmemoryayırmak üzeresizeof()ilemalloc()kullan- Döndürülen pointer'ın
NULLolup olmadığını test ederekmemory allocationişleminin başarılı olup olmadığını kontrol et allocationbaşarısız olursaMemory allocation failed!yazdır ve programı sonlandırallocationbaşarılı olursaMemory allocation successful!yazdır- Kullanıcıdan
nintegerdeğeri oku ve bunları ayrılanarrayiçindestoreet - Tüm değerlerin toplamını hesapla ve şu biçimde yazdır:
Sum: [value] - 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: 16Bu 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;
}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
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları6Bellek Yönetimi
Stack ve Heap BellekDinamik Bellek Ayırma - malloc()Bellek Ayırma için sizeof() KullanımıBellek Ayırma Hatasını Kontrol Etmefree() ile Belleği Serbest Bırakmacalloc() ile Bellek AyırmaÖzet: Dinamik DiziKendi başına pratik yap: Online C derleyicisi