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
#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
#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
struct Person *p = ____(sizeof(struct Person));
struct Person *p = malloc(sizeof(struct Person));
Açıklama: malloc, struct için heap'ten bellek ayırır.