Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bellek bloklarını yeniden ayırma.
Sözdizimi
void *realloc(
void *memblock,
size_t size
);
Parametreler
memblock
Önceden ayrılmış bellek bloğu işaretçisi.
size
Bayt cinsinden yeni boyut.
Dönüş değeri
realloc yeniden ayrılan (ve büyük olasılıkla taşınan) bellek bloğuna bir void işaretçi döndürür.
Bloğu verilen boyuta genişletmek için yeterli kullanılabilir bellek yoksa, özgün blok değiştirilmeden bırakılır ve NULL döndürülür.
Sıfır ise size , tarafından memblock işaret edilen blok serbest bırakılır; dönüş değeri olur NULLve memblock serbest bırakılmış bir bloğu işaret eder.
Dönüş değeri, herhangi bir nesne türünün depolaması için uygun olan bir depolama alanını gösterir. dışında voidbir türe işaretçi almak için dönüş değerinde tür tür ataması kullanın.
Açıklamalar
Not
realloc yeni davranış Windows işletim sistemiyle uyumlu olmadığından C17 davranışını uygulayacak şekilde güncelleştirilmedi.
İşlev, realloc ayrılan bellek bloğunun boyutunu değiştirir. memblock Bağımsız değişken, bellek bloğunun başlangıcını gösterir. ise memblock NULL, realloc ile malloc aynı şekilde davranır ve yeni bir bayt bloğu size ayırır. değilse memblock NULL, önceki bir , veya reallocçağrısı callocmalloctarafından döndürülen bir işaretçi olmalıdır.
size bağımsız değişkeni bloğun yeni boyutunu bayt cinsinden verir. Bloğun içeriği, yeni ve eski boyutların en kısasına kadar değiştirilmez, ancak yeni blok farklı bir konumda olabilir. Yeni blok yeni bir bellek konumunda olabileceğinden, tarafından realloc döndürülen işaretçinin bağımsız değişkenden memblock geçirilen işaretçi olması garanti değildir. realloc arabellek büyümesi varsa yeni ayrılan belleği sıfırlamıyor.
reallocENOMEM, bellek ayırmanın başarısız olup olmadığını veya istenen bellek miktarının aşılıp aşılmadığını _HEAP_MAXREQolarak ayarlarerrno. Bu ve diğer hata kodları hakkında bilgi için bkz. errno, _doserrno, _sys_errlistve _sys_nerr.
reallocyeni işleyici modunu ayarlamak için C++ _set_new_mode işlevini kullanmak için çağrılarmalloc. Yeni işleyici modu, hata malloc durumunda tarafından _set_new_handlerayarlanan yeni işleyici yordamının çağrılıp çağrılmayacağını belirtir. Varsayılan olarak, malloc bellek ayırma hatasında yeni işleyici yordamını çağırmaz. Bu varsayılan davranışı geçersiz kılarak bellek malloc ayrılamaması durumunda realloc yeni işleyici yordamını işlecin aynı nedenden dolayı başarısız olduğu gibi new çağırmasını sağlayabilirsiniz. Varsayılanı geçersiz kılmak için
_set_new_mode(1);
programlarının başında veya NEWMODE ile bağlantı oluşturun. OBJ (bkz . Bağlantı seçenekleri).
Uygulama C çalışma zamanı kitaplıklarının hata ayıklama sürümüyle bağlandığında, realloc olarak _realloc_dbgçözümlenir. Yığın hata ayıklama işlemi sırasında nasıl yönetilir hakkında daha fazla bilgi için bkz . CRT hata ayıklama yığını.
reallocve __declspec(restrict)olarak işaretlenir__declspec(noalias), başka bir deyişle işlevin genel değişkenleri değiştirmemesi garanti edilir ve döndürülen işaretçinin diğer adla işaretlenmediği anlamına gelir. Daha fazla bilgi için bkz. noalias ve restrict.
Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.
Gereksinimler
| Yordam | Gerekli başlık |
|---|---|
realloc |
<stdlib.h> ve <malloc.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000