Menu
Coddy logo textTech

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() belleği dinamik olarak 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 tipini depolamak için gereken bayt sayısını döndürür. Bayt boyutlarını manuel olarak yazmak 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ğrudur

Bu yaklaşım, özellikle diziler için bellek tahsis ederken oldukça 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 türlerinin 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.

challenge icon

Görev

Kolay

Dinamik 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:

  1. Kullanıcıdan tahsis edilecek eleman sayısını temsil eden bir n tam sayısı okumalı
  2. n adet double değeri için belleği dinamik olarak tahsis etmek üzere sizeof() ile birlikte malloc() kullanmalı
  3. Döndürülen void işaretçisini (pointer) bir double işaretçisine dönüştürmeli (cast)
  4. Kullanıcıdan n adet double değeri okumalı ve bunları tahsis edilen dizide saklamalı
  5. Tahsis edilen toplam belleği bayt cinsinden hesaplamalı ve şu formatta yazdırmalı: Memory allocated: [bytes] bytes
  6. Tüm değerlerin ortalamasını hesaplamalı ve tam olarak 2 ondalık basamakla şu formatta yazdırmalı: Average: [value]
  7. En büyük değeri bulmalı ve tam olarak 2 ondalık basamakla şu formatta yazdırmalı: Largest: [value]

malloc() işlevini 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.80

Bu meydan okuma, 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.

Kendin dene

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

int main() {
    // Eleman sayısını oku
    int n;
    scanf("%d", &n);
    
    // TODO: Kodunuzu aşağıya yazın
    // 1. malloc() ve sizeof() kullanarak n tane 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 (cast)
    // 3. n tane double değeri okuyun ve bunları ayrılan dizide saklayın
    // 4. Ayrılan belleği bayt cinsinden hesaplayın ve yazdırın
    // 5. Ortalamayı hesaplayın ve ondalık basamağı 2 olacak şekilde yazdırın
    // 6. En büyük değeri bulun ve ondalık basamağı 2 olacak şekilde yazdırın
    
    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.

Logic & Flow bölümündeki tüm dersler