C
realloc ile büyütme
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.
Örnek çözümü göster
#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;
}
Kendini test et
-
realloc davranışlarını eşle
- 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
-
realloc NULL dönerse ne olur?
- Eski bellek serbest bırakılır
- Program çöker
- Eski bellek hâlâ geçerlidir
- arr NULL olur
Cevabı göster
Eski bellek hâlâ geçerlidir — realloc başarısızsa eski blok serbest bırakılmaz; hâlâ geçerlidir.
-
Güvenli realloc deseni
int *tmp = ____(arr, 5 * sizeof(int));
if (tmp) arr = tmp;
Cevabı göster
int *tmp = realloc(arr, 5 * sizeof(int));
if (tmp) arr = tmp;
Sıradaki ders: Bellek sızıntısı