Condividi tramite


_expand

Modifica la dimensione di un blocco di memoria.

Sintassi

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

Parametri

memblock
Puntatore al blocco di memoria allocato in precedenza.

size
Nuova dimensione in byte.

Valore restituito

_expand restituisce un puntatore a void al blocco di memoria riallocato. _expand, a differenza reallocdi , non può spostare un blocco per modificarne le dimensioni. Pertanto, se è disponibile memoria sufficiente per espandere il blocco senza spostarlo, il memblock parametro in _expand corrisponde al valore restituito.

_expand restituisce NULL quando viene rilevato un errore durante l'operazione. Ad esempio, se _expand viene usato per la compattazione di un blocco di memoria, potrebbe rilevare il danneggiamento dell'heap di piccoli blocchi o un puntatore di blocco non valido e restituire NULL.

Se non è disponibile memoria sufficiente per espandere il blocco senza spostarlo, la funzione restituisce NULL. _expand non restituisce mai un blocco espanso a dimensioni minori di quelle richieste. Se si verifica un errore, errno indica la natura dell'errore. Per altre informazioni su errno, vedere errno, _doserrno, _sys_errliste _sys_nerr.

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

Osservazioni:

La funzione _expand modifica le dimensioni di un blocco di memoria allocato in precedenza cercando di espandere o comprimere il blocco senza spostarne la posizione nell'heap. Il parametro memblock punta all'inizio del blocco. Il parametro size specifica le nuove dimensioni del blocco, in byte. Il contenuto del blocco rimane invariato fino alla dimensione nuova o alla precedente, a seconda di quale delle due è la più breve. memblock non dovrebbe essere un blocco che è stato liberato.

Nota

Su piattaforme a 64 bit, _expand potrebbe non contrarre il blocco se la nuova dimensione è minore rispetto alla dimensione corrente. In particolare se il blocco è inferiore a 16 KB e quindi allocato nell'heap a bassa frammentazione, _expand lascia il blocco invariato e restituisce memblock.

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

Questa funzione convalida i relativi parametri. Se memblock è un puntatore Null, questa funzione richiama un gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno viene impostato su EINVAL e la funzione restituisce NULL. Se size è maggiore di _HEAP_MAXREQ, errno è impostato su ENOMEMe la funzione restituisce NULL.

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

Requisiti

Funzione Intestazione obbligatoria
_expand <malloc.h>

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

Esempio

// crt_expand.c

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main( void )
{
   char *bufchar;
   printf( "Allocate a 512 element buffer\n" );
   if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
      exit( 1 );
   printf( "Allocated %d bytes at %Fp\n",
         _msize( bufchar ), (void *)bufchar );
   if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
      printf( "Can't expand" );
   else
      printf( "Expanded block to %d bytes at %Fp\n",
            _msize( bufchar ), (void *)bufchar );
   // Free memory
   free( bufchar );
   exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC

Vedi anche

Allocazione di memoria
calloc
free
malloc
_msize
realloc