realloc

Повторное выделение блоков памяти.

Синтаксис

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

Параметры

memblock
Указатель на ранее выделенный блок памяти.

size
Новый размер в байтах.

Возвращаемое значение

realloc возвращает указатель void в перераспределенном (и, возможно, перемещенном) блоке памяти.

Если доступной памяти недостаточно для расширения блока до заданного размера, исходный блок остается без изменений и NULL возвращается.

Если size равен нулю, то блок, на который указывает memblock, освобождается; возвращается значение NULL, memblock по-прежнему указывает на освобожденный блок.

Возвращаемое значение указывает на дисковое пространство, подходящее для хранения объектов любого типа. Чтобы получить указатель на тип, отличный от void, используйте приведение типов для возвращаемого значения.

Комментарии

Примечание

realloc Не был обновлен для реализации поведения C17, так как новое поведение несовместимо с операционной системой Windows.

Функция realloc изменяет размер выделенного блока памяти. Аргумент memblock указывает на начало блока памяти. Если параметр memblock имеет значение NULL, функция realloc ведет себя так же, как и функция malloc, выделяя новый блок размером size байтов. Если memblock параметр не NULLимеет значение , это должен быть указатель, возвращенный предыдущим вызовом calloc, mallocили realloc.

Аргумент size указывает новый размер блока в байтах. Содержимое блока в пределах наименьшего из нового и старого размеров остается неизменным, хотя новый блок может находиться в другом расположении. Так как новый блок может находиться в новом расположении памяти, указатель, возвращаемый параметром realloc , не гарантируется, что он будет указателем, передаваемым memblock через аргумент . realloc не обнуляет только что выделенную память при росте буфера.

Функция realloc задает для параметра errno значение ENOMEM, если выделение памяти завершается сбоем или количество запрошенной памяти превышает _HEAP_MAXREQ. Сведения об этом и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

realloc вызывает malloc , чтобы использовать функцию C++ _set_new_mode для установки нового режима обработчика. Новый режим обработки указывает, должна ли функция malloc при сбое вызывать новую подпрограмму обработчика, заданную функцией _set_new_handler. По умолчанию malloc не вызывает новую подпрограмму обработчика при сбое выделения памяти. Можно переопределить это поведение по умолчанию, чтобы в случае сбоя предоставления памяти функцией realloc функция malloc вызывала новую подпрограмму обработчика таким же образом, как это делает оператор new при сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите

_set_new_mode(1);

в начале программы, или связать с NEWMODE. OBJ (см. раздел Параметры ссылки).

Если приложение связано с отладочной версией библиотек времени выполнения C, realloc разрешается в _realloc_dbg. Дополнительные сведения об управлении кучей в процессе отладки см. в разделе Куча отладки CRT.

realloc помечается __declspec(noalias) и __declspec(restrict)означает, что функция гарантированно не будет изменять глобальные переменные, а возвращаемый указатель не является псевдонимом. Дополнительные сведения см. в разделах noalias и restrict.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования

Подпрограмма Обязательный заголовок
realloc <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример

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

См. также раздел

Выделение памяти
calloc
free
malloc