CodeBlanks Logo Icon CodeBlanks

realloc ile büyütme

  • C kursu
  • Orta seviye
  • Ders 8/116
  • 5 dk

realloc ile diziyi yeniden boyutlandırmayı öğrenirsin.

realloc ile yeniden boyutlandırma

realloc, daha önce ayrılmış bir bellek bölgesini büyütür veya küçültür. Yazım: void *realloc(void *ptr, size_t new_size);.

Örnek: arr = realloc(arr, 5 * sizeof(int));. Eski içerik korunur; yeni elemanlar başlatılmamış olur. Önemli bir nokta: realloc başarısız olursa NULL döndürür ve eski bellek hâlâ geçerlidir. Bu yüzden doğrudan arr = realloc(arr, ...) yazmak tehlikelidir; başarısızlıkta eski adresi kaybedersin. Güvenli desen: geçici bir işaretçi kullan.

Güvenli realloc deseni

Güvenli realloc, geçici bir işaretçi ile yapılır. Önce tmp = realloc(arr, new_size) çağrılır; tmp NULL değilse arr = tmp yapılır.

Örnek: int *tmp = realloc(arr, 5 * sizeof(int)); if (tmp) arr = tmp;. Bu desende, realloc başarısız olsa bile arr eski adresini korur ve free(arr) ile bellek iade edilebilir. Yeni boyut eski içerikten küçükse, taşan kısım kaybolur. Bellek yönetimi titizlik ister; bu desen, büyük ayırmalarda standarttır.

Uygulama Diziyi realloc ile büyüt

int *arr = malloc(2 * sizeof(int)); ile iki elemanlı dizi ayır. arr[0] = 1; arr[1] = 2; ata. Güvenli realloc deseniyle diziyi 4 elemana büyüt: int *tmp = realloc(arr, 4 * sizeof(int)); if (tmp) arr = tmp;. Yeni iki elemana 3 ve 4 ata. Bir for döngüsüyle dört elemanı printf("%d ", arr[i]) ile yazdır, printf("\n") ekle. free(arr); ile iade et.

Başlangıç kodu

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

// iki elemanli dizi ayir ve 1, 2 ata
// guvenli realloc ile dorde buyut
// 3, 4 ata, yazdir ve 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 = malloc(2 * sizeof(int));
    arr[0] = 1;
    arr[1] = 2;
    int *tmp = realloc(arr, 4 * sizeof(int));
    if (tmp) arr = tmp;
    arr[2] = 3;
    arr[3] = 4;
    for (int i = 0; i < 4; i++) printf("%d ", arr[i]);
    printf("\n");
    free(arr);
    return 0;
}

Beklenen çıktı

1 2 3 4

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 realloc davranışlarını eşle

Kavram Anlamı
realloc(NULL, n) malloc gibi davranır
realloc(ptr, 0) free gibi davranır
realloc(ptr, daha büyük) Büyütür
realloc başarısız Eski blok geçerli

2 realloc NULL dönerse ne olur?

  • Eski bellek serbest bırakılır
  • Program çöker
  • Eski bellek hâlâ geçerlidir Doğru cevap
  • arr NULL olur

Açıklama: realloc başarısızsa eski blok serbest bırakılmaz; hâlâ geçerlidir.

3 Güvenli realloc deseni

Soru
int *tmp = ____(arr, 5 * sizeof(int));
if (tmp) arr = tmp;
Cevap
int *tmp = realloc(arr, 5 * sizeof(int));
if (tmp) arr = tmp;

Açıklama: realloc var olan bloğu yeniden boyutlandırır.

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