CodeBlanks Logo Icon CodeBlanks

Struct dinamik

  • C kursu
  • Orta seviye
  • Ders 31/116
  • 5 dk

malloc ile struct için dinamik bellek ayırmayı öğrenirsin.

Dinamik struct

Bir struct'ı ömür boyu heap'te tutmak için malloc kullanırsın. struct Person *p = malloc(sizeof(struct Person)); çağrısı, heap'ten enough bayt ayırır ve işaretçiyi döndürür.

sizeof(struct Person), derleyicinin struct için gereken bayt sayısını verir; böylece elle hesap yapmak zorunda kalmazsın. Dönüş türü void*'dir; C'de otomatik olarak struct Person*'a dönüştürülür. Başarısız olursa NULL döner; bu yüzden kullanmadan önce denetlemek gerekir. Kullanım bitince free(p) ile belleği iade etmek şarttır.

free ve NULL denetimi

malloc her zaman başarılı değildir; bellek doluysa NULL döner. NULL işaretçiye erişim tanımsız davranıştır; bu yüzden denetim şarttır.

Örnek desen: struct Person *p = malloc(sizeof(struct Person)); if (p == NULL) return 1; p->age = 25; ... free(p);. free(p) belleği iade eder ama p'yi NULL yapmaz; bu yüzden free'den sonra p = NULL yazmak iyi bir alışkanlıktır. Her malloc için bir free olmalı; eksik free bellek sızıntısı (memory leak) yaratır.

Uygulama Dinamik struct oluştur ve yazdır

struct Person tanımla: char name[32]; ve int age;. main içinde struct Person *p = malloc(sizeof(struct Person)); ile bellek ayır. if (p == NULL) return 1; ile denetle. p->age = 25; ata, printf("%d\n", p->age); ile yazdır, son olarak free(p); çağır.

Başlangıç kodu

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

// struct Person tanımla (name[32] ve age)
// malloc ile p işaretçisine bellek ayır
// p üzerinden age'i 25 yap, yazdır, sonunda free çağır

int main(void) {
    return 0;
}

Örnek çözüm

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

struct Person {
    char name[32];
    int age;
};

int main(void) {
    struct Person *p = malloc(sizeof(struct Person));
    if (p == NULL) return 1;
    p->age = 25;
    printf("%d\n", p->age);
    free(p);
    return 0;
}

Beklenen çıktı

25

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 malloc ifadelerini eşle

Kavram Anlamı
malloc(sizeof(struct Person)) Bellek ayırma
p->age = 25 Alan atama
free(p) Bellek bırakma
p == NULL Boşluk denetimi

2 malloc başarısız olursa ne döner?

  • NULL Doğru cevap
  • 0
  • -1
  • Boş struct

Açıklama: malloc başarısız olursa NULL döner; bu yüzden denetim şarttır.

3 malloc çağrısını tamamla

Soru
struct Person *p = ____(sizeof(struct Person));
Cevap
struct Person *p = malloc(sizeof(struct Person));

Açıklama: malloc, struct için heap'ten bellek ayırır.

Orta seviye bölümündeki tüm dersler