0Pricing
C Academy · Ders

calloc ve realloc

Sıfırlanmış ve yeniden boyutlandırılmış bellek

calloc ve realloc, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

malloc'un Ötesi

Standart kitaplık, malloc'un yanı sıra sıfırlanmış bellek için calloc ve mevcut bir bloğu yeniden boyutlandırmak için realloc sunar.

Her ikisi de <stdlib.h> içinde bulunur.

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

int main(void) {
    int *p = calloc(3, sizeof(int));
    printf("%d %d %d\n", p[0], p[1], p[2]);
    free(p);
    return 0;
}

calloc Belleği Sıfırlar

calloc(count, size), size baytlık count öğe için yer ayırır ve her baytı sıfıra ayarlar.

Temiz bir başlangıç gerektiğinde bu oldukça kullanışlıdır.

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

int main(void) {
    int *a = calloc(5, sizeof(int));
    int sum = 0;
    for (int i = 0; i < 5; i++) sum += a[i];
    printf("sum of zeroed array = %d\n", sum);
    free(a);
    return 0;
}

calloc İki Bağımsız Değişken Alır

malloc'un aksine calloc, sayıyı ve öğe boyutunu ayrı ayrı alır.

Ayrıca sayı ile boyut çarpılırken taşmaya karşı koruma sağlar.

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

int main(void) {
    double *d = calloc(4, sizeof(double));
    d[2] = 1.5;
    printf("%f %f\n", d[0], d[2]);
    free(d);
    return 0;
}

malloc ve calloc Karşılaştırması

Her baytın üzerine zaten yazacaksanız malloc, belleğin sıfırdan başlamasına güveniyorsanız calloc kullanın.

Sıfırlama işlemi nedeniyle calloc biraz daha maliyetlidir.

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

int main(void) {
    int *m = malloc(2 * sizeof(int));
    int *c = calloc(2, sizeof(int));
    m[0] = 5; m[1] = 6;
    printf("malloc: %d %d\n", m[0], m[1]);
    printf("calloc: %d %d\n", c[0], c[1]);
    free(m); free(c);
    return 0;
}

realloc ile Büyütme

realloc(ptr, newsize), bir bloğun boyutunu değiştirir ve mevcut içeriğini eski ve yeni boyutlardan küçük olanına kadar korur.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    a[0] = 1; a[1] = 2;
    a = realloc(a, 4 * sizeof(int));
    a[2] = 3; a[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", a[i]);
    printf("\n");
    free(a);
    return 0;
}

realloc Bloğu Taşıyabilir

realloc, yer açmak için bloğu başka bir konuma taşırsa farklı bir adres döndürebilir.

Sonucu her zaman yeniden atayın ve eski işaretçiyi kullanmaya devam etmeyin.

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

int main(void) {
    int *a = malloc(sizeof(int));
    a[0] = 42;
    int *bigger = realloc(a, 100 * sizeof(int));
    printf("first element still %d\n", bigger[0]);
    free(bigger);
    return 0;
}

Güvenli realloc Kalıbı

realloc başarısız olursa NULL döndürür, ancak özgün bloğu olduğu gibi bırakır.

Başarısızlık durumunda eski işaretçiyi kaybetmemek için sonucu önce geçici bir değişkene atayın.

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

int main(void) {
    int *a = malloc(2 * sizeof(int));
    int *tmp = realloc(a, 8 * sizeof(int));
    if (tmp == NULL) {
        free(a);
        return 1;
    }
    a = tmp;
    a[7] = 99;
    printf("%d\n", a[7]);
    free(a);
    return 0;
}

Bloğu Küçültme

realloc bir bloğu küçültebilir de. Baştaki öğeler korunur, geri kalan bellek serbest bırakılır.

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

int main(void) {
    int *a = malloc(6 * sizeof(int));
    for (int i = 0; i < 6; i++) a[i] = i;
    a = realloc(a, 3 * sizeof(int));
    printf("%d %d %d\n", a[0], a[1], a[2]);
    free(a);
    return 0;
}

Büyüyen Bir Arabellek

Yaygın bir kalıp, dizi dolduğunda kapasiteyi iki katına çıkararak büyüme maliyetini zamana yayar.

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

int main(void) {
    int cap = 2, len = 0;
    int *a = malloc(cap * sizeof(int));
    for (int v = 0; v < 5; v++) {
        if (len == cap) {
            cap *= 2;
            a = realloc(a, cap * sizeof(int));
        }
        a[len++] = v;
    }
    printf("len=%d cap=%d last=%d\n", len, cap, a[len-1]);
    free(a);
    return 0;
}

NULL ile realloc

realloc(NULL, size), tam olarak malloc(size) gibi davranır.

Bu, büyütme yordamının ilk ayırmayı da aynı şekilde ele almasını sağlar.

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

int main(void) {
    int *a = realloc(NULL, 3 * sizeof(int));
    a[0] = 7;
    printf("%d\n", a[0]);
    free(a);
    return 0;
}

Bunları Birleştirme

Sıfırlanmış bir arabellek için calloc ile başlayıp daha sonra bunu realloc ile büyütebilirsiniz. Büyütme sonrasında eklenen yeni baytlar sıfırlanmaz.

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

int main(void) {
    int *a = calloc(2, sizeof(int));
    a = realloc(a, 4 * sizeof(int));
    a[2] = 0; a[3] = 0;
    printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
    free(a);
    return 0;
}

Hızlı Kontrol

calloc ve realloc hakkındaki bilginizi sınayın.

Özet

İki ayırma aracını daha öğrendiniz:

  • calloc(count, size), sıfırlanmış bellek ayırır ve çarpma taşmasına karşı koruma sağlar.
  • realloc(ptr, newsize), bir bloğu yeniden boyutlandırır ve bloğu taşıyabilir.
  • Başarısızlık durumunda bellek sızıntılarını önlemek için realloc sonucunu her zaman geçici bir değişkene atayın.
  • realloc(NULL, size), malloc gibi davranır.

Sıkça Sorulan Sorular

“calloc ve realloc” dersi ücretsiz mi?

Evet — “calloc ve realloc” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“calloc ve realloc” dersinde ne öğreneceğim?

Sıfırlanmış ve yeniden boyutlandırılmış bellek C Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“calloc ve realloc” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. malloc ve free
  2. calloc ve realloc
  3. Bellek Sızıntıları
  4. Sarkan İşaretçiler
← C Academy Sayfasına Dön