Sdílet prostřednictvím


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

reallocvoid 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 NULLa 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, mallocnebo 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_doserrnoerrno

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

Viz také

Přidělení paměti
calloc
free
malloc