Condividi tramite


realloc

Riallocare blocchi di memoria.

Sintassi

void *realloc(
   void *memblock,
   size_t size
);

Parametri

memblock
Puntatore al blocco di memoria allocato in precedenza.

size
Nuova dimensione in byte.

Valore restituito

realloc restituisce un puntatore void al blocco di memoria riallocato (e possibilmente spostato).

Se la memoria disponibile non è sufficiente per espandere il blocco fino alle dimensioni specificate, il blocco originale rimane invariato e NULL viene restituito.

Se size è zero, il blocco puntato da memblock viene liberato; il valore restituito è NULL e memblock punta a un blocco liberato.

Il valore restituito punta a uno spazio di archiviazione allineato in modo adeguato per l'archiviazione di qualsiasi tipo di oggetto. Per ottenere un puntatore a un tipo diverso da void, usare un cast del tipo sul valore restituito.

Osservazioni:

Nota

realloc non è stato aggiornato per implementare il comportamento C17 perché il nuovo comportamento non è compatibile con il sistema operativo Windows.

La funzione realloc modifica la dimensione di un blocco di memoria allocato. L'argomento memblock punta all'inizio del blocco di memoria. Se memblock è NULL, realloc si comporta allo stesso modo di malloc e alloca un nuovo blocco di size byte. Se memblock non NULLè , deve essere un puntatore restituito da una chiamata precedente a calloc, malloco realloc.

L'argomento size fornisce la nuova dimensione del blocco, in byte. Il contenuto del blocco rimane invariato fino alla più breve dimensione, tra la nuova e la precedente, anche se il nuovo blocco può trovarsi in una posizione diversa. Poiché il nuovo blocco può trovarsi in una nuova posizione di memoria, il puntatore restituito da realloc non è garantito che il puntatore venga passato tramite l'argomento memblock . realloc non zero memoria appena allocata se è presente un aumento del buffer.

realloc imposta errno su ENOMEM se l'allocazione di memoria ha esito negativo o se la quantità di memoria richiesta supera _HEAP_MAXREQ. Per informazioni su questo e altri codici di errore, vedere errno, _doserrno, _sys_errliste _sys_nerr.

realloc chiama malloc per usare la funzione C++ _set_new_mode per impostare la nuova modalità del gestore. La nuova modalità del gestore indica se, in caso di errore, malloc deve chiamare la routine del nuovo gestore come impostato da _set_new_handler. Per impostazione predefinita, malloc non chiama la nuova routine del gestore in caso di errore di allocazione della memoria. È possibile eseguire l'override di questo comportamento predefinito in modo che, quando realloc non riesce ad allocare memoria, malloc chiami la routine del nuovo gestore, come fa l'operatore new quando non riesce per lo stesso motivo. Per eseguire l'override del comportamento predefinito, chiamare

_set_new_mode(1);

all'inizio di un programma o collegarsi a NEWMODE. OBJ (vedere Opzioni di collegamento).

Quando l'applicazione è collegata a una versione di debug delle librerie di runtime C, realloc viene risolto in _realloc_dbg. Per altre informazioni sulla gestione dell'heap durante il processo di debug, vedere Heap di debug CRT.

realloc è contrassegnato __declspec(noalias) e __declspec(restrict), il che significa che la funzione non può modificare le variabili globali e che il puntatore restituito non è aliasato. Per altre informazioni, vedere noalias e restrict.

Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificare questo comportamento, vedere Stato globale in CRT.

Requisiti

Ciclo Intestazione obbligatoria
realloc <stdlib.h> e <malloc.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

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

Vedi anche

Allocazione di memoria
calloc
free
malloc