Giriş
Şu satırı dahil ederiz.
Metodun imzası şöyle
Metodun genellikle yeni bir bellek alanı yaratması ve eski bilgilerin sığdığı kadarını da kopyalaması beklenir.
Kullanım
Şöyle yaparız. Yeni döndürülen pointer'ı saklar ve null olup olmadığını kontrol ederiz. Eğer null değilse eski pointer'a atarız. null ise hata vardır
realloc çağrısı başarısız olursa da eski bellek alanı halen geçerlidir.
Eski bellek alanı artık yok olmuştur. Kullanmamak gerekir.
Belleği Küçültmek
Eğer metod belleği küçültmek için kullanılıyorsa aynı bellek alanını da döndürebilir. Şöyle yaparız
realloc aynen free() metodunda olduğu gibi, heap veri yapılarına erişebildiği için malloc ile ayrılmış alanın kaç byte tuttuğunu da biliyor. Metodun imzası void * alsa bile sorun olmuyor.
Şu satırı dahil ederiz.
#include <stdlib.h>
Bu metod standart C metodudurMetodun imzası şöyle
void *realloc(void *ptr, size_t size);
Açıklaması şöyleThe realloc function deallocates the old object pointed to by ptr and returns a pointer to a new object that has the size specified by size.realloc fonksiyonu daha önce malloc ya da calloc fonksiyonlarıyla tahsis edilmiş bellek bloğunu büyültmek ya da küçültmek amacıyla kullanılır.
Metodun genellikle yeni bir bellek alanı yaratması ve eski bilgilerin sığdığı kadarını da kopyalaması beklenir.
Şöyle yaparız. Yeni döndürülen pointer'ı saklar ve null olup olmadığını kontrol ederiz. Eğer null değilse eski pointer'a atarız. null ise hata vardır
tempPtr = realloc (oldPtr, newSize);
if (tempPtr) //allocation successful, oldPtr is `free()`-d can be reused now
{
oldPtr = tempPtr;
} // and continue using `oldPtr`
else
{
// some error handling
// can still make use of `oldPtr`
}
Yanlış kullanım şöyledir. realloc başarısız olursa null döner ve eski pointer'ı kaybederiz.pointerVar = realloc (pointerVar , newsize); // use the same pointer variable
realloc başarısız olursarealloc çağrısı başarısız olursa da eski bellek alanı halen geçerlidir.
void *buffer = realloc(oldbuffer, sizeof(oldbuffer)*2);
if ( !buffer )
// take some action.... the old buffer is still valid
else
...
realloc başarılı olursaEski bellek alanı artık yok olmuştur. Kullanmamak gerekir.
double *a = (double *) malloc(sizeof(double) * 20);...
double *b = (double *) realloc(a, 30);
a[20] = 11; //Error!a[21
] = 12; //Error!
Eğer metod belleği küçültmek için kullanılıyorsa aynı bellek alanını da döndürebilir. Şöyle yaparız
// Intialize big array
int * a = (int *)malloc(10*sizeof(int));
assert(a);
// Fill it with squares
for (int i = 0; i < 10; ++i)
a[i] = i*i;
// Expected to print 64
printf("%d\n", a[8]);
// Shrink the big array
int * b = (int *)realloc(a, 5*sizeof(int));
assert(b);
// Expected to cause SEGFAULT
printf("%d\n", b[8]);
realloc ilk parametrenin ne kadar büyüklükte yer tuttuğunu nereden biliyor?realloc aynen free() metodunda olduğu gibi, heap veri yapılarına erişebildiği için malloc ile ayrılmış alanın kaç byte tuttuğunu da biliyor. Metodun imzası void * alsa bile sorun olmuyor.
Hiç yorum yok:
Yorum Gönder