Bellek Ayırma için sizeof() Kullanımı
Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 33 / 63.
malloc() belleği dinamik olarak ayırmanıza olanak tanırken, kodunuzu daha taşınabilir ve bakımı daha kolay hâle getiren önemli bir en iyi uygulama vardır: kaç bayt ayrılacağını belirlemek için sizeof() operatörünü kullanmak.
sizeof() operatörü, sisteminizde belirli bir veri türünü depolamak için gereken bayt sayısını döndürür. Bayt boyutlarını sabit kodlamak yerine, doğru miktarı otomatik olarak sizeof() hesaplayabilir:
// Bayt boyutlarını tahmin etmek yerine:
int *ptr = (int*)malloc(4); // int türünün 4 bayt olduğunu varsayar
// Taşınabilirlik için sizeof() kullanın:
int *ptr = (int*)malloc(sizeof(int)); // Her zaman doğruBu yaklaşım, diziler için bellek ayırırken özellikle değer kazanır. Birden fazla öğe için bellek ayırmak üzere, öğe sayısını her bir öğenin boyutuyla çarpın:
// 10 tamsayı için bellek ayır
int *arr = (int*)malloc(10 * sizeof(int));
// 5 double için bellek ayır
double *values = (double*)malloc(5 * sizeof(double));sizeof() kullanmak, veri türlerinin boyutlarının farklı olabileceği çeşitli sistemlerde kodunuzun doğru çalışmasını sağlar ve belirli bir türdeki belirli sayıda öğe için alan ayırma niyetinizi açıkça ifade eder.
Görev
KolayDinamik bellek ayırma için sizeof() işlevinin malloc() ile doğru kullanımını gösteren bir C programı yaz. Programın:
- Ayırılacak öğe sayısını belirten bir
ntam sayısını kullanıcıdan okuması nadet double değerinden oluşan bir dizi için dinamik olarak bellek ayırmak üzeresizeof()ile birliktemalloc()kullanması- Döndürülen void işaretçisini double işaretçisine dönüştürmesi
- Kullanıcıdan
nadet double değer okuması ve bunları ayrılan diziye kaydetmesi - Ayrılan toplam belleği bayt cinsinden hesaplaması ve şu biçimde yazdırması:
Memory allocated: [bytes] bytes - Tüm değerlerin ortalamasını tam olarak 2 ondalık basamakla şu biçimde hesaplaması ve yazdırması:
Average: [value] - En büyük değeri tam olarak 2 ondalık basamakla şu biçimde bulması ve yazdırması:
Largest: [value]
malloc() işlevini kullanmak için <stdlib.h> başlık dosyasını eklemeyi unutma. Programın, sizeof() işlevinin sistemdeki veri türü boyutlarından bağımsız olarak doğru bellek ayırmayı nasıl sağladığını göstermeli.
Örneğin, girdi şuysa:
3
2.5 7.8 4.1Çıktın şöyle olmalı:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Bu alıştırma, dinamik bellek ayırmanı taşınabilir ve sürdürülebilir hâle getirmek, her sistemde herhangi bir veri türü için gereken doğru bayt sayısını otomatik olarak hesaplamak amacıyla sizeof() kullanmanın önemini pekiştirir.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
int main() {
// Eleman sayısını oku
int n;
scanf("%d", &n);
// TODO: Kodunu aşağıya yaz
// 1. malloc() ve sizeof() kullanarak n adet double değer için bellek ayır
// 2. Döndürülen işaretçiyi double* türüne dönüştür
// 3. n adet double değer oku ve bunları ayrılan dizide sakla
// 4. Ayrılan bellek miktarını bayt cinsinden hesapla ve yazdır
// 5. Ortalamayı hesapla ve virgülden sonra 2 basamakla yazdır
// 6. En büyük değeri bul ve virgülden sonra 2 basamakla yazdır
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