Bellek Ayırma için sizeof() Kullanımı
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 33 / 63.
malloc() dinamik olarak bellek ayırmanıza olanak tanırken, kodunuzu daha taşınabilir ve bakımı kolay hale 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 olarak kodlamak yerine, sizeof() operatörünün doğru miktarı otomatik olarak hesaplamasını sağlayabilirsiniz:
// Bayt boyutlarını tahmin etmek yerine:
int *ptr = (int*)malloc(4); // int'in 4 bayt olduğunu varsayar
// Taşınabilirlik için sizeof() kullanın:
int *ptr = (int*)malloc(sizeof(int)); // Her zaman doğrudurBu yaklaşım, özellikle diziler için yer ayırırken değerli hale gelir. Birden fazla öğe için yer ayırmak için, öğe sayısını her bir öğenin boyutuyla çarpın:
// 10 tam sayı için yer ayır
int *arr = (int*)malloc(10 * sizeof(int));
// 5 double için yer ayır
double *values = (double*)malloc(5 * sizeof(double));sizeof() kullanmak, veri tiplerinin farklı boyutlara sahip olabileceği farklı sistemlerde kodunuzun doğru çalışmasını sağlar ve belirli bir türdeki belirli sayıda öğe için yer ayırma niyetinizi açıkça belirtir.
Görev
KolayDinamik bellek tahsisi için malloc() ile sizeof() işlevinin doğru kullanımını gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Kullanıcıdan tahsis edilecek eleman sayısını temsil eden bir
ntam sayısı okumalıdır nadet double değerinden oluşan bir dizi için belleği dinamik olarak tahsis etmek üzeresizeof()ile birliktemalloc()kullanmalıdır- Döndürülen void işaretçisini (pointer) bir double işaretçisine dönüştürmelidir (cast)
- Kullanıcıdan
nadet double değeri okumalı ve bunları tahsis edilen dizide saklamalıdır - Tahsis edilen toplam belleği bayt cinsinden hesaplamalı ve şu formatta yazdırmalıdır:
Memory allocated: [bytes] bytes - Tüm değerlerin ortalamasını hesaplamalı ve tam olarak 2 ondalık basamakla şu formatta yazdırmalıdır:
Average: [value] - En büyük değeri bulmalı ve tam olarak 2 ondalık basamakla şu formatta yazdırmalıdır:
Largest: [value]
malloc() kullanmak için <stdlib.h> başlık dosyasını eklemeyi unutmayın. Programınız, sizeof() işlevinin sistemin veri tipi boyutlarından bağımsız olarak doğru bellek tahsisini nasıl sağladığını göstermelidir.
Örneğin, giriş şu şekildeyse:
3
2.5 7.8 4.1Çıktınız şu şekilde olmalıdır:
Memory allocated: 24 bytes
Average: 4.80
Largest: 7.80Bu zorluk, dinamik bellek tahsisinizi taşınabilir ve bakımı kolay hale getirmek için sizeof() kullanmanın önemini pekiştirir; herhangi bir sistemdeki herhangi bir veri tipi için gereken doğru bayt sayısını otomatik olarak hesaplar.
Kopya kağıdı
Herhangi bir veri türü için ayrılacak doğru bayt sayısını belirlemek için sizeof() operatörünü malloc() ile birlikte kullanın:
// Taşınabilir bellek ayırma
int *ptr = (int*)malloc(sizeof(int));
// Diziler için yer ayırma
int *arr = (int*)malloc(10 * sizeof(int));
double *values = (double*)malloc(5 * sizeof(double));sizeof() operatörü, sisteminizde bir veri türünü depolamak için gereken bayt sayısını döndürür; bu da kodunuzu, veri türlerinin farklı boyutlara sahip olabileceği farklı platformlar arasında taşınabilir hale getirir.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
int main() {
// Eleman sayısını oku
int n;
scanf("%d", &n);
// YAPILACAK: Kodunuzu aşağıya yazın
// 1. malloc() ve sizeof() kullanarak n adet double değeri için bellek ayırın
// 2. Döndürülen işaretçiyi (pointer) double* türüne dönüştürün
// 3. n adet double değeri okuyun ve ayrılan dizide saklayın
// 4. Ayrılan belleği bayt cinsinden hesaplayın ve yazdırın
// 5. Ortalamayı hesaplayın ve virgülden sonra 2 basamakla yazdırın
// 6. En büyük değeri bulun ve virgülden sonra 2 basamakla yazdırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow 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 Dizi