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