_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.
Retornar valor
_expand
retorna um ponteiro nulo para o bloco de memória realocado. _expand
, ao contrário realloc
do , não pode mover um bloco para alterar seu tamanho. Assim, se houver memória suficiente disponível para expandir o bloco sem movê-lo, o parâmetro para _expand
será o mesmo que o memblock
valor de retorno.
_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 CRT.
Essa função valida seus parâmetros. Se memblock
for um ponteiro nulo, essa função invocará um manipulador de parâmetros 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
, é definido como ENOMEM
, errno
e a função retorna NULL
.
Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, consulte Estado global na 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
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de