Bellek tahsisi desenleri
- C kursu
- Orta seviye
- Ders 11/116
- 5 dk
Sık bellek tahsisi desenlerini öğrenirsin.
malloc, calloc ve realloc farkı
C'de üç temel ayırma fonksiyonu vardır. malloc başlatılmamış bellek ayırır; calloc sıfırla başlatılmış bellek ayırır; realloc var olan bloğu yeniden boyutlandırır.
Örnekler: int *a = malloc(3 * sizeof(int)); çöp değerler içerebilir. int *b = calloc(3, sizeof(int)); tüm elemanları sıfır yapar. b = realloc(b, 5 * sizeof(int)); bloğu büyütür. calloc'un iki parametresi (eleman sayısı ve eleman boyutu) çarpılarak toplam boyutu verir. Sıfır başlatma gerektiğinde calloc tercih edilir.
NULL kontrolü deyimi
Büyük ayırmalarda malloc ve calloc başarısız olabilir; NULL döndürürler. Bu yüzden ayırmadan sonra kontrol şarttır. Desen: ayır, kontrol et, hata varsa çık.
Örnek: int *arr = malloc(1000 * sizeof(int)); if (arr == NULL) return 1;. Burada ayırma başarısız olursa program 1 ile çıkar; yoksa devam eder. Üretim kodunda, hata durumunda daha önce ayrılan bellekleri de iade etmelisin. Bu desen, özellikle kullanıcı girdisine bağlı ayırmalarda standarttır; güvenilir programların temelidir.
Uygulama calloc ile sıfırlı dizi
int *arr = calloc(3, sizeof(int)); ile üç elemanlı, sıfırlı dizi ayır. İlk iki elemana 5 ve 7 ata. Bir for döngüsüyle üç elemanı da printf("%d ", arr[i]) ile yazdır; üçüncü elemanın sıfır olması calloc'dan gelir. Sonuna printf("\n") ekle. free(arr); ile iade et.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
// calloc ile uc elemanli sifirli dizi ayir
// ilk iki elemana 5 ve 7 ata
// for ile yazdir, free ile iade et
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *arr = calloc(3, sizeof(int));
arr[0] = 5;
arr[1] = 7;
for (int i = 0; i < 3; i++) printf("%d ", arr[i]);
printf("\n");
free(arr);
return 0;
}Beklenen çıktı
5 7 0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Fonksiyonu kullanıma eşle
| Kavram | Anlamı |
|---|---|
malloc(n * sizeof(T)) |
Başlatılmamış ayırma |
calloc(n, sizeof(T)) |
Sıfırlı ayırma |
realloc(ptr, n) |
Yeniden boyut |
free(ptr) |
İade |
2 calloc çağrısını tamamla
int *arr = ____(3, sizeof(int));
int *arr = calloc(3, sizeof(int));
Açıklama: calloc(count, size) sıfırlı bellek ayırır.
3 Hangi fonksiyon belleği sıfırla başlatır?
- malloc
- calloc Doğru cevap
- realloc
- free
Açıklama: calloc, tüm baytları sıfır yapar.