Condividi tramite


realloc

Riallocare blocchi di memoria

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

Parametri

  • memblock
    Puntatore al blocco di memoria allocato precedentemente.

  • size
    Nuova dimensione in byte.

Valore restituito

realloc restituisce un puntatore a void (ed eventualmente spostato) al blocco di memoria riallocato.

Se non è disponibile memoria sufficiente per espandere il blocco alla dimensione specificata, il blocco originale rimane invariato e viene NULL.

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

I valore restituito punta ad uno spazio di memoria che garantisce l'allineamento adeguato per l'archiviazione di qualsiasi tipo di oggetto. Per ottenere un puntatore a un tipo diverso da void, utilizzare un cast di tipo sul valore restituito.

Note

La funzione realloc modifica la dimensione di un blocco di memoria allocata. Il parametro 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, a malloc, o a realloc.

L'argomento di size fornisce la nuova dimensione del blocco, in byte. Il contenuto del blocco è invariato fino alla dimensione più breve tra la nuova e la vecchia, anche se il nuovo blocco può trovarsi in un percorso diverso. Poiché il nuovo blocco può trovarsi in una nuova posizione di memoria, il puntatore restituito da realloc non è detto che sia lo stesso puntatore passato tramite l'argomento memblock. realloc non azzera la nuova memoria allocata in caso di crescita del buffer.

realloc imposta errno a ENOMEM se l'allocazione della memoria non riesce o se la quantità di memoria richiesta supera _HEAP_MAXREQ. Per informazioni su questi e altri codici di errore, vedere errno, _doserrno, _sys_errlist, and _sys_nerr.

reallocchiama mallocper utilizzare la funzione C++ _set_new_mode per impostare la nuova modalità di gestione. La nuova modalità del gestore indica se, in caso di errore, malloc deve richiamare la nuova routine del gestore come imposto da _set_new_handler. Per impostazione predefinita, malloc non richiama la nuova routine di gestione in caso di errore nell'allocare memoria. È possibile eseguire l'override di questo comportamento predefinito affinché, quando realloc non riesce ad allocare memoria, malloc chiami la nuova routine del gestore allo stesso modo di come avviene con l'operatore new quando si verifica il medesimo errore. Per eseguire l'override del comportamento predefinito, chiamare

_set_new_mode(1)

all'inizio del programma, o collegare con NEWMODE.OBJ (vedere Opzioni collegamento).

Quando l'applicazione viene collegata a una versione di debug delle librerie di runtime del linguaggio C, realloc viene identificato come _realloc_dbg. Per ulteriori informazioni su come viene gestito l'heap durante il processo di debug, vedere L'heap di debug CRT.

realloc è contrassegnata in __declspec(noalias) e __declspec(restrict), pertanto la funzione garantisce che le variabili globali non vengono modificate, e che il puntatore restituito è già utilizzato. Per ulteriori informazioni, vedere noalias e limiti.

Requisiti

Routine

Intestazione obbligatoria

realloc

<stdlib.h> e <malloc.h>

Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'Introduzione.

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 );
}
  

Equivalente .NET Framework

Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di Invocazione della Piattaforma.

Vedere anche

Riferimenti

Allocazione di memoria

calloc

disponibili

malloc