CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
int *arr = ____(3, sizeof(int));
Cevap
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.

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