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