21 Ağustos 2017 Pazartesi

realloc metodu

Giriş
Şu satırı dahil ederiz.
#include <stdlib.h>
Bu metod standart C metodudur

Metodun imzası şöyle
void *realloc(void *ptr, size_t size);
Açıklaması şöyle
The 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.

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
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 olursa
realloc ç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ı olursa
Eski 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!

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
// 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