realloc
Reasigna bloques de memoria.
Sintaxis
void *realloc(
void *memblock,
size_t size
);
Parámetros
memblock
Puntero al bloque de memoria asignado previamente.
size
Nuevo tamaño en bytes.
Valor devuelto
realloc
devuelve un puntero void
al bloque de memoria reasignado (y, probablemente, trasladado).
Si no hay suficiente memoria disponible para expandir el bloque al tamaño especificado, el bloque original se deja sin modificar y NULL
se devuelve.
Si size
es cero, el bloque señalado por memblock
se libera; el valor devuelto es NULL
y memblock
sigue apuntando a un bloque liberado.
El valor devuelto apunta a un espacio de almacenamiento correctamente alineado para almacenar cualquier tipo de objeto. Para obtener un puntero a un tipo distinto de void
, use una conversión de tipo en el valor devuelto.
Comentarios
Nota:
realloc
no se ha actualizado para implementar el comportamiento de C17 porque el nuevo comportamiento no es compatible con el sistema operativo Windows.
La función realloc
cambia el tamaño de un bloque de memoria asignado. El argumento memblock
apunta al principio del bloque de memoria. Si memblock
es NULL
, realloc
se comporta del mismo modo que malloc
y asigna un nuevo bloque de size
bytes. Si memblock
no NULL
es , debe ser un puntero devuelto por una llamada anterior a calloc
, malloc
o realloc
.
El argumento size
proporciona el tamaño nuevo del bloque (en bytes). El contenido del bloque es igual hasta el más pequeño de los tamaños nuevo y antiguo, aunque el bloque nuevo puede estar en otra ubicación. Dado que el nuevo bloque puede estar en una nueva ubicación de memoria, no se garantiza que el puntero devuelto por realloc
sea el puntero pasado por el memblock
argumento . realloc
no cero memoria recién asignada si hay crecimiento del búfer.
realloc
establece errno
en ENOMEM
si se produce un error de asignación de memoria o si la cantidad de memoria solicitada supera _HEAP_MAXREQ
. Para obtener más información sobre este y otros códigos de error, vea errno
, _doserrno
, _sys_errlist
y _sys_nerr
.
realloc
llama a malloc
para usar la función _set_new_mode
de C++ y establecer el nuevo modo de controlador. El nuevo modo de controlador indica si, en caso de error, malloc
va a llamar a la rutina del nuevo controlador, según lo establecido por _set_new_handler
. De forma predeterminada, malloc
no llama a la rutina del nuevo controlador en caso de error al asignar memoria. Puede invalidar este comportamiento predeterminado para que, cuando realloc
no pueda asignar memoria, malloc
llame a la rutina del nuevo controlador de la misma forma que hace el operador new
cuando se produce un error por la misma razón. Para invalidar el valor predeterminado, llame a
_set_new_mode(1);
al principio de un programa o vincule con NEWMODE. OBJ (consulte Opciones de vínculo).
Cuando la aplicación se vincula con una versión de depuración de las bibliotecas en tiempo de ejecución de C, realloc
se resuelve como _realloc_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.
realloc
está marcado como __declspec(noalias)
y __declspec(restrict)
, lo que significa que se garantiza que la función no modifica variables globales y que el puntero devuelto no tiene alias. Para obtener más información, vea noalias
y restrict
.
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
Routine | Encabezado necesario |
---|---|
realloc |
<stdlib.h> y <malloc.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000