_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 reallocdo , 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

Alocação de memória
calloc
free
malloc
_msize
realloc