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
, malloc
o 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_errlist
e _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