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.
Görev
Kolaycalloc() 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:
- Kullanıcıdan, ayrılacak tamsayı sayısını temsil eden bir
sizetamsayısı okuyun calloc()adet tamsayıdan oluşan bir dizi için dinamik olarak bellek ayırmak üzeresizekullanın- 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 - Bellek ayırma başarılı olursa
Memory allocated and initialized to zero!yazdırın - 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] ... - Kullanıcıdan
sizeadet tamsayı değeri okuyun ve bunları ayrılan diziye kaydedin - Güncellenmiş tüm değerleri şu biçimde yazdırın:
Updated values: [value1] [value2] [value3] ... - Tüm değerlerin toplamını hesaplayın ve şu biçimde yazdırın:
Sum: [value] - Belleği serbest bırakmak için
free()kullanın - 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;
}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ıKendi başına pratik yap: Online C derleyicisi