Menu
Coddy logo textTech

Yapıların Dinamik Tahsisi

Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 48 / 63.

Şimdiye kadar, yığında (stack) struct'ların nasıl oluşturulacağını öğrendiniz - bunlar bildirildikleri kapsam (scope) içinde var olurlar ve bu kapsam sona erdiğinde otomatik olarak temizlenirler. Peki ya bir struct'ın orijinal kapsamının ötesinde kalıcı olmasına ihtiyaç duyarsanız veya derleme zamanında (compile time) kaç tane struct'a ihtiyacınız olacağını bilmiyorsanız?

İşte burada dinamik bellek ayırma devreye girer. Tıpkı diğer veri türlerinde yaptığınız gibi, heap üzerinde struct'lar oluşturmak için malloc() kullanabilirsiniz. Temel fark, dinamik olarak ayrılmış struct'ların, siz onları free() ile açıkça serbest bırakana kadar bellekte kalmasıdır.

Bir yapıyı (struct) dinamik olarak bellekten ayırmak için kullanılan sözdizimi şöyledir:

struct Point *ptr = malloc(sizeof(struct Point));

Bu, bir Point yapısını (struct) tutmak için yığında (heap) yeterli bellek tahsis eder ve bu belleğe bir işaretçi (pointer) döndürür. Ardından, yapı üyelerine erişmek ve onları değiştirmek için ok operatörünü kullanabilirsiniz:

ptr->x = 10;
ptr->y = 20;

Bellek sızıntılarını önlemek için her zaman malloc() fonksiyonunun başarılı olup olmadığını (NULL olmayan bir değer döndürdüğünü) kontrol etmeyi ve struct ile işiniz bittiğinde free(ptr) fonksiyonunu çağırmayı unutmayın. Bu teknik, çalışma zamanında veri yapıları oluşturabilen ve yönetebilen esnek programlar oluşturmak için gereklidir.

challenge icon

Görev

Kolay

malloc() kullanarak struct'ların dinamik olarak tahsis edilmesini gösteren bir C programı oluşturun. Programınız şunları yapmalıdır:

  1. Aşağıdaki üyelere sahip Car adında bir struct tanımlayın:
    • Üretim yılını saklamak için bir tamsayı year
    • Araba markasını saklamak için 20 boyutunda bir karakter dizisi brand
    • Araba modelini saklamak için 25 boyutunda bir karakter dizisi model
    • Araba fiyatını saklamak için bir float price
    • Arabanın kilometresini saklamak için bir tamsayı mileage
  2. Ana fonksiyonda, carPtr adında bir Car struct işaretçisi (pointer) bildirin
  3. Bir Car struct'ı için dinamik olarak bellek tahsis etmek üzere malloc() kullanın ve döndürülen adresi carPtr değişkenine atayın
  4. Bellek tahsisinin başarılı olup olmadığını kontrol edin:
    • Eğer carPtr değeri NULL ise, "Memory allocation failed" yazdırın ve programdan çıkın
    • Tahsis başarılı olduysa, "Memory allocation successful" yazdırın
  5. Aşağıdaki giriş değerlerini okuyun ve ok operatörünü kullanarak bunları struct üyelerine atayın:
    • Yıl için bir tamsayı okuyun ve carPtr->year kullanarak atayın
    • Marka için bir dize okuyun ve carPtr->brand kullanarak atayın
    • Model için bir dize okuyun ve carPtr->model kullanarak atayın
    • Fiyat için bir float okuyun ve carPtr->price kullanarak atayın
    • Kilometre için bir tamsayı okuyun ve carPtr->mileage kullanarak atayın
  6. Tüm değerleri okuduktan sonra, ok operatörünü kullanarak aşağıdaki hesaplamaları yapın:
    • 2024 yılından yılı çıkararak arabanın yaşını hesaplayın: int age = 2024 - carPtr->year;
    • Yaşa göre amortisman oranını hesaplayın: eğer yaş 10'dan büyükse amortismanı 0.6 olarak, aksi takdirde 0.8 olarak ayarlayın
    • Güncel değeri hesaplayın: carPtr->price * depreciation
  7. Araba bilgilerini ok operatörünü kullanarak tam olarak şu formatta yazdırın:
    • "Car Information:"
    • "Year: [year]"
    • "Brand: [brand]"
    • "Model: [model]"
    • "Original Price: [price]"
    • "Mileage: [mileage]"
    • "Age: [age] years"
    • "Current Value: [current_value]"
  8. free(carPtr) kullanarak dinamik olarak tahsis edilen belleği serbest bırakın
  9. "Memory freed successfully" yazdırın

Bu zorluk; malloc() kullanarak dinamik struct tahsisi, tahsis hatasını kontrol etme, ok operatörünü kullanarak işaretçiler aracılığıyla struct üyelerine erişme ve free() ile tahsis edilen belleği düzgün bir şekilde serbest bırakma konusundaki anlayışınızı test eder. Struct'lar ile dinamik bellek yönetiminin tüm yaşam döngüsünü pratik edeceksiniz.

Kopya kağıdı

Struct'ları yığında (heap) dinamik olarak tahsis etmek için malloc() kullanın:

struct Point *ptr = malloc(sizeof(struct Point));

Ok operatörünü kullanarak struct üyelerine işaretçiler aracılığıyla erişin:

ptr->x = 10;
ptr->y = 20;

malloc() işleminin başarılı olup olmadığını her zaman kontrol edin ve işiniz bittiğinde belleği serbest bırakın:

if (ptr == NULL) {
    // Tahsis hatasını yönetin
}
// Struct'ı kullanın...
free(ptr);

Kendin dene

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

// YAPILACAK: Car yapısını (struct) burada tanımlayın

int main() {
    // YAPILACAK: carPtr adında Car yapısına (struct) bir işaretçi (pointer) bildirin
    
    // YAPILACAK: Bir Car yapısı için bellek ayırmak üzere malloc() kullanın
    
    // YAPILACAK: Bellek tahsisinin başarılı olup olmadığını kontrol edin
    
    // Giriş değerlerini oku
    int year, mileage;
    char brand[20], model[25];
    float price;
    
    scanf("%d", &year);
    scanf("%s", brand);
    scanf("%s", model);
    scanf("%f", &price);
    scanf("%d", &mileage);
    
    // YAPILACAK: Ok operatörünü kullanarak giriş değerlerini yapı üyelerine atayın
    
    // YAPILACAK: Yaşı, amortismanı ve mevcut değeri hesaplayın
    
    // YAPILACAK: Araç bilgilerini istenen formatta yazdırın
    
    // YAPILACAK: Ayrılan belleği serbest bırakın ve başarı mesajını 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