_expand
Altera o tamanho de um bloco de memória.
Sintaxe
void *_expand(
void *memblock,
size_t size
);
Parâmetros
memblock
Ponteiro para o bloco de memória alocado anteriormente.
size
Novo tamanho em bytes.
Valor retornado
_expand
retorna um ponteiro nulo para o bloco de memória realocado. _expand
, ao contrário realloc
de , não pode mover um bloco para alterar seu tamanho. Portanto, se houver memória suficiente disponível para expandir o bloco sem movê-lo, o memblock
parâmetro para _expand
será o mesmo que o valor retornado.
_expand
retorna NULL
quando um erro é detectado durante sua operação. Por exemplo, se _expand
é usado para reduzir um bloco de memória, ele pode detectar corrupção de heap de bloco pequeno ou um ponteiro de bloco inválido e retornar NULL
.
Se não houver memória suficiente disponível para expandir o bloco sem movê-lo, a função retornará NULL
. _expand
nunca retorna um bloco expandido para um tamanho menor do que o solicitado. Se ocorrer uma falha, errno
indicará a natureza da falha. Para obter mais informações sobre errno
, consulte errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
O valor retornado indica um espaço de armazenamento que está adequadamente alinhado para armazenamento de qualquer tipo de objeto. Para verificar o novo tamanho do item, use _msize
. Para obter um ponteiro para um tipo que não seja void
, use uma conversão de tipo no valor retornado.
Comentários
A função _expand
altera o tamanho de um bloco de memória alocado anteriormente ao tentar expandir ou recolher o bloco sem mover seu local no heap. O parâmetro memblock
aponta para o início do bloco. O parâmetro size
fornece o novo tamanho do bloco, em bytes. O conteúdo do bloco é inalterado até o menor dos tamanhos novos e antigos. memblock
não deve ser um bloqueio que foi liberado.
Observação
Em plataformas de 64 bits, _expand
não pode reduzir o bloco se o novo tamanho for menor que o tamanho atual, em particular, se o bloco for menor que 16K em tamanho e, portanto, alocado no heap de fragmentação baixo, _expand
deixará o bloco inalterado e retornará memblock
.
Quando o aplicativo estiver vinculado a uma versão de depuração das bibliotecas de runtime do C, _expand
será resolvido como _expand_dbg
. Para obter mais informações sobre como o heap é gerenciado durante o processo de depuração, consulte O heap de depuração do CRT.
Essa função valida seus parâmetros. Se memblock
for um ponteiro nulo, essa função invocará um manipulador de parâmetro inválido, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno
será definido como EINVAL
e a função retornará NULL
. Se size
for maior que _HEAP_MAXREQ
, errno
é definido como ENOMEM
, e a função retorna NULL
.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.
Requisitos
Função | Cabeçalho necessário |
---|---|
_expand |
<malloc.h> |
Para obter informações sobre compatibilidade, consulte Compatibilidade.
Exemplo
// 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