Share via


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 NULLes , debe ser un puntero devuelto por una llamada anterior a calloc, malloco 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

Consulte también

Asignación de memoria
calloc
free
malloc