Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 reallocde , 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