0Pricing
C Academy · Ders

realloc ile Büyütme

Dinamik bir diziyi yeniden boyutlandırın.

realloc ile Büyütme, 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.

Bir malloc Yeterli Olmadığında

Bazen bir dizi için yer ayırır, onu doldurur ve ardından daha fazla yere ihtiyacınız olduğunu fark edersiniz. Dizinin sonunun ötesine yazamazsınız.

realloc, mevcut bir öbek bloğunun boyutunu değiştirmenizi ve oradaki verileri korumanızı sağlar.

realloc İmzası

realloc(ptr, new_bytes), eski işaretçiyi ve bayt cinsinden yeni toplam boyutu alır.

Yeni boyuttaki bir bloğa işaretçi döndürür. Verilerin ilk bölümü, eski ve yeni boyutlardan küçük olanına kadar korunur.

int *bigger = realloc(a, new_n * sizeof(*a));

Bloğu Taşıyabilir

realloc bloğu bulunduğu yerde büyütebilir veya yeni bir blok ayırıp verilerinizi kopyalayarak eski bloğu serbest bırakabilir.

Her iki durumda da eski işaretçi geçersiz hâle gelebilir. Bundan sonra döndürülen işaretçiyi kullanmalısınız.

a = realloc(a, new_n * sizeof(*a));
/* the old value of a may no longer be valid */

Kendine Atama Tuzağı

a = realloc(a, ...) yazmak düzenli görünür, ancak tehlikelidir: realloc NULL döndürürse a'nın üzerine yazmış ve eski işaretçiyi kaybederek eski bloğun sızmasına neden olmuş olursunuz.

Bunun yerine geçici bir değişken kullanın.

int *tmp = realloc(a, new_n * sizeof(*a));
if (tmp == NULL) { /* a is still valid */ return 1; }
a = tmp;

Bir Diziyi Güvenle Büyütme

Bu program 3 int için yer ayırır, ardından realloc ile 6'ya çıkarır ve ilk üç değeri korur.

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

int main(void) {
    int *a = malloc(3 * sizeof(*a));
    if (!a) return 1;
    for (int i = 0; i < 3; i++) a[i] = i + 1;

    int *tmp = realloc(a, 6 * sizeof(*a));
    if (!tmp) { free(a); return 1; }
    a = tmp;

    for (int i = 3; i < 6; i++) a[i] = i + 1;
    for (int i = 0; i < 6; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

Yeni Baytlar Başlatılmamıştır

Bir bloğu büyüttüğünüzde sondaki ek alan, tıpkı yeni malloc belleği gibi çöp değerler taşır.

realloc eski verilerinizi korur, ancak yeni bölgeyi sıfırlamaz. Okumadan önce bu bölgeyi başlatın.

a = realloc(a, 6 * sizeof(*a));
for (int i = 3; i < 6; i++) a[i] = 0;  /* clear new slots */

İkiye Katlama Stratejisi

Her tek eleman için realloc çağırmak yavaştır. Klasik bir yöntem, alanınız tükendiğinde kapasiteyi iki katına çıkarmaktır.

Bu yaklaşım, dizi büyürken yeniden ayırma sayısını düşük tutar ve iyi bir ortalama performans sağlar.

if (count == cap) {
    cap = cap ? cap * 2 : 4;
    int *tmp = realloc(a, cap * sizeof(*a));
    if (!tmp) { free(a); return 1; }
    a = tmp;
}

Ekleme Yaparak Dizi Oluşturma

Bu program boş başlar, sayıları ekler ve gerektiğinde kapasiteyi iki katına çıkarır.

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

int main(void) {
    int *a = NULL;
    size_t count = 0, cap = 0;
    for (int v = 1; v <= 5; v++) {
        if (count == cap) {
            cap = cap ? cap * 2 : 2;
            int *tmp = realloc(a, cap * sizeof(*a));
            if (!tmp) { free(a); return 1; }
            a = tmp;
        }
        a[count++] = v;
    }
    for (size_t i = 0; i < count; i++) printf("%d\n", a[i]);
    free(a);
    return 0;
}

realloc(NULL, n), malloc Gibi Davranır

İşaretçi olarak NULL verirseniz realloc, tam olarak malloc gibi davranır.

İkiye katlama döngüsünde a = NULL ile başlamanın işe yaramasının nedeni budur: ilk realloc çağrısı başlangıç bloğunu ayırır.

int *a = NULL;
a = realloc(a, 4 * sizeof(*a));  /* same as malloc(4 * sizeof(*a)) */

Bir Bloğu Küçültme

realloc bir bloğu küçültebilir de. Yeni boyuta kadar olan veriler korunur; geri kalanı atılır.

Küçültme belleği geri verebilir, ancak uygulamalar daha büyük bloğu korumakta serbesttir.

int *tmp = realloc(a, 2 * sizeof(*a));  /* down from more */
if (tmp) a = tmp;

Matematikte Taşmayı Önleme

Kapasite büyüdüğünde cap * sizeof(*a) bir size_t değerini aşarak çok küçük bir sayıya dönüşebilir.

Çok büyük dizilerde çarpma işlemini denetleyin veya bunu destekleyen sistemlerde reallocarray kullanın.

if (cap > SIZE_MAX / sizeof(*a)) { /* overflow */ return 1; }
int *tmp = realloc(a, cap * sizeof(*a));

Hızlı Kontrol

realloc konusundaki anlayışınızı sınayın.

Özet

realloc yığın bloğunun boyutunu değiştirir ve bloğu taşıyabilir; bu nedenle her zaman döndürülen göstericiyi kullanın.

Başarısızlık durumunda özgün bellek sızdırılmasın diye sonucu geçici bir değişkene atayın. Hız için kapasiteyi iki katına çıkarın, yeni yuvaları başlatın ve realloc(NULL, n) ifadesinin malloc ile aynı olduğunu unutmayın. Sırada bu mantığı yeniden kullanılabilir bir vektör türü içinde sarmalayacaksınız.

Sıkça Sorulan Sorular

“realloc ile Büyütme” dersi ücretsiz mi?

Evet — “realloc ile Büyütme” 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.

“realloc ile Büyütme” dersinde ne öğreneceğim?

Dinamik bir diziyi yeniden boyutlandırın. 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.

“realloc ile Büyütme” 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. Dizi Ayırma
  2. realloc ile Büyütme
  3. Yeniden Kullanılabilir Vektör Türü
  4. Belleği Serbest Bırakma ve Sızıntıları Önleme
← C Academy Sayfasına Dön