realloc
Uvolněte bloky paměti.
Syntaxe
void *realloc(
void *memblock,
size_t size
);
Parametry
memblock
Ukazatel na dříve přidělený blok paměti
size
Nová velikost v bajtech
Vrácená hodnota
realloc
void
vrátí ukazatel na relokovaný (a pravděpodobně přesunutý) blok paměti.
Pokud není k dispozici dostatek paměti pro rozšíření bloku na danou velikost, původní blok zůstane beze změny a NULL
vrátí se.
Pokud size
je nula, blok, na který memblock
odkazuje, je uvolněn; návratová hodnota je NULL
a memblock
vlevo ukazuje na uvolněný blok.
Návratová hodnota odkazuje na prostor úložiště, který je vhodně zarovnaný pro úložiště libovolného typu objektu. Pokud chcete získat ukazatel na jiný typ než void
, použijte přetypování typu na návratovou hodnotu.
Poznámky
Poznámka:
realloc
Nebylo aktualizováno, aby implementovalo chování C17, protože nové chování není kompatibilní s operačním systémem Windows.
Funkce realloc
změní velikost přiděleného bloku paměti. Argument memblock
odkazuje na začátek bloku paměti. Pokud memblock
ano NULL
, realloc
chová se stejným způsobem jako malloc
a přiděluje nový blok size
bajtů. Pokud memblock
není NULL
, měl by to být ukazatel vrácený předchozím voláním calloc
, malloc
nebo realloc
.
Argument size
dává novou velikost bloku v bajtech. Obsah bloku se nezmění až na kratší velikost nových a starých velikostí, i když nový blok může být v jiném umístění. Vzhledem k tomu, že nový blok může být v novém umístění paměti, není zaručeno, že ukazatel vrácený realloc
ukazatelem bude předán prostřednictvím argumentu memblock
. realloc
nově přidělenou paměť nenuluje, pokud dojde k růstu vyrovnávací paměti.
realloc
nastaví errno
, ENOMEM
pokud přidělení paměti selže nebo pokud požadovaná velikost paměti překročí _HEAP_MAXREQ
. Informace o těchto a dalších kódech chyb naleznete v tématu , , , a_sys_nerr
. _sys_errlist
_doserrno
errno
realloc
volání malloc
pro použití funkce C++ _set_new_mode
k nastavení nového režimu obslužné rutiny. Nový režim obslužné rutiny označuje, zda při selhání malloc
je volání nové rutiny obslužné rutiny nastavena ._set_new_handler
Ve výchozím nastavení nevolá rutinu nové obslužné rutiny při malloc
selhání přidělení paměti. Toto výchozí chování můžete přepsat tak, aby při realloc
selhání přidělení paměti malloc
volaly novou rutinu obslužné rutiny stejným způsobem jako new
operátor v případě selhání z stejného důvodu. Pokud chcete přepsat výchozí nastavení, zavolejte
_set_new_mode(1);
v rané fázi programu nebo propojení s NEWMODE. OBJ (viz možnosti propojení).
Pokud je aplikace propojena s ladicí verzí knihoven runtime jazyka C, realloc
přeloží na _realloc_dbg
. Další informace o správě haldy během procesu ladění naleznete v části Haldy ladění CRT.
realloc
je označen a __declspec(noalias)
__declspec(restrict)
, což znamená, že funkce zaručuje, že nebude upravovat globální proměnné a že vrácený ukazatel není aliasován. Další informace najdete v tématech noalias
a restrict
.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Požadavky
Rutina | Požadovaný hlavičkový soubor |
---|---|
realloc |
<stdlib.h> a <malloc.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// 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