Поделиться через


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

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

Пример

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