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
#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
#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
int *tmp = ____(arr, 5 * sizeof(int));
if (tmp) arr = tmp;
int *tmp = realloc(arr, 5 * sizeof(int));
if (tmp) arr = tmp;
Açıklama: realloc var olan bloğu yeniden boyutlandırır.