Compartir a través de


_expand

Cambia el tamaño de un bloque de memoria.

Sintaxis

void *_expand(
   void *memblock,
   size_t size
);

Parámetros

memblock
Puntero al bloque de memoria asignado previamente.

size
Nuevo tamaño en bytes.

Valor devuelto

_expand devuelve un puntero void al bloque de memoria reasignado. _expand, a diferencia reallocde , no puede mover un bloque para cambiar su tamaño. Por lo tanto, si hay suficiente memoria disponible para expandir el bloque sin moverlo, el memblock parámetro a _expand es el mismo que el valor devuelto.

_expand devuelve NULL cuando se detecta un error durante la operación. Por ejemplo, si _expand se usa para reducir un bloque de memoria, podría detectar daños en el montón en bloque pequeño o un puntero de bloque no válido y devolver NULL.

Si no hay suficiente memoria disponible para expandir el bloque sin moverlo, la función devuelve NULL. _expand nunca devuelve un bloque expandido a un tamaño inferior al solicitado. Si se produce un error, errno indica la naturaleza del error. Para obtener más información sobre errno, consulte errno, _doserrno, _sys_errlist y _sys_nerr.

El valor devuelto apunta a un espacio de almacenamiento correctamente alineado para almacenar cualquier tipo de objeto. Para comprobar el nuevo tamaño del elemento, use _msize. Para obtener un puntero a un tipo distinto de void, use una conversión de tipo en el valor devuelto.

Comentarios

La función _expand cambia el tamaño de un bloque de memoria asignado previamente intentando expandir o contraer el bloque sin mover su ubicación en el montón. El parámetro memblock apunta al principio del bloque. El parámetro size proporciona el nuevo tamaño del bloque (en bytes). El contenido del bloque queda sin modificar hasta el menor de los tamaños nuevos y antiguos. memblock no debe ser un bloque que se haya liberado.

Nota:

En plataformas de 64 bits, puede que _expand no contraiga el bloque si el nuevo tamaño es menor que el tamaño actual; en concreto, si el bloque tenía un tamaño inferior a 16 KB y, por lo tanto, se había asignado al montón de baja fragmentación, _expand deja el bloque sin modificar y devuelve memblock.

Cuando la aplicación se vincula con una versión de depuración de las bibliotecas en tiempo de ejecución de C, _expand se resuelve como _expand_dbg. Para obtener más información sobre cómo se administra el montón durante el proceso de depuración, consulte El montón de depuración de CRT.

Esta función valida sus parámetros. Si memblock es un puntero nulo, esta función invoca un controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, errno está establecido en EINVAL y la función devuelve NULL. Si size es mayor que _HEAP_MAXREQ, errno se establece ENOMEMen y la función devuelve NULL.

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Requisitos

Función Encabezado necesario
_expand <malloc.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

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

Vea también

Asignación de memoria
calloc
free
malloc
_msize
realloc