_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 realloc
de , 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 ENOMEM
en 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