_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 realloc
di , 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_errlist
e _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 ENOMEM
e 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