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

Confira também

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