_expand
Modifica la dimensione di un blocco di memoria.
void *_expand(
void *memblock,
size_t size
);
Parametri
memblock
Puntatore al blocco di memoria allocato precedentemente.size
Nuova dimensione in byte.
Valore restituito
_expand restituisce un puntatore void al blocco di memoria riallocato. _expand, a differenza di realloc, non può spostare un blocco per modificare le sue dimensioni. Pertanto, se vi è memoria sufficiente ad espandere il blocco senza spostarlo, il parametro memblock a _expand è uguale al valore restituito.
_expand restituisce NULL quando viene rilevato un errore durante l'operazione. Ad esempio, se _expand viene utilizzato per ridurre un blocco di memoria, potrebbe rilevare il danneggiamento di un blocco nell'heap oppure un puntatore di blocco non valido e ritorna NULL.
Se la memoria disponibile non è sufficiente per espandere il blocco alla dimensione specificata senza spostarlo, la funzione restituisce NULL. _expand non restituisce mai un blocco espanso ad una dimensione minore di quella richiesta. Se si verifica un errore, errno indica la natura dell'errore. Per ulteriori informazioni su errno, vedere errno, _doserrno, _sys_errlist, and _sys_nerr.
I valore restituito punta ad uno spazio di memoria che garantisce l'allineamento adeguato per l'archiviazione di qualsiasi tipo di oggetto. Per controllare la nuova dimensione dell'elemento, utilizzare _msize. Per ottenere un puntatore a un tipo diverso da void, utilizzare un cast di tipo sul valore restituito.
Note
La funzione _expand cambia la dimensione ad un blocco di memoria precedentemente allocato tentando di espandere o contrarre il blocco senza spostarne la posizione nell'heap. Il parametro memblock punta all'inizio del blocco . Il parametro size fornisce la nuova dimensione del blocco, in byte. Il contenuto del blocco è invariato fino alla più corta delle nuove e vecchie dimensioni. memblock non deve essere un blocco che è stato liberato.
Nota
Sulle piattaforme a 64 bit, _expand potrebbe non contrarre il blocco se la nuova dimensione è inferiore alla dimensione corrente; in particolare, se il blocco è minore di 16K nella dimensione e quindi allocato nell'heap inferiore di frammentazione , _expand lascia invariato il blocco e restituisce memblock.
Quando l'applicazione viene collegata a una versione di debug delle librerie di runtime del linguaggio C, _expand viene identificato come _expand_dbg. Per ulteriori informazioni su come viene gestito l'heap durante il processo di debug, vedere L'heap di debug CRT.
Questa funzione convalida i parametri. Se memblock è un puntatore a null, questa funzione richiama un gestore di parametro non valido, 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.
Requisiti
Funzione |
Intestazione obbligatoria |
---|---|
_expand |
<malloc.h> |
Per ulteriori informazioni sulla compatibilità, vedere Compatibilità nell'Introduzione.
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 );
}
Equivalente .NET Framework
Non applicabile. Per chiamare la funzione standard C, utilizzare PInvoke. Per ulteriori informazioni, vedere Esempi di Invocazione della Piattaforma.