realloc()

Выделить, перевыделить или освободить область памяти

Прототип:

#include <stdlib.h>
void * realloc( void *old_blk,
size_t size );

Аргументы:

old_blk
Указатель на блок памяти, который нужно выделить, перевыделить или освободить.
size
Новый размер блока памяти в байтах.

Библиотека:

libc

Описание:

Функция realloc() выделяет, перевыделяет или освобождает область памяти, указанную в old_blk, основываясь на правилах, описанных далее. Вы можете частично контролировать поведение функции с помощью переменной окружения MALLOC OPTIONS.

Функция realloc() выделяет память из кучи. Используйте free() или realloc(), чтобы освободить блок памяти.


Note:
  • Реализация malloc() использует 32-битные целые числа со знаком для внутреннего представления размера, поэтому невозможно выделить более 2 ГБ за один вызов функции. Если размер выделяемой памяти превышает 2 ГБ, realloc() указывает на ошибку ENOMEM.

  • Поскольку возможно, что будет выделен новый блок, любые указатели на старую память могут стать недействительными. Эти указатели будут указывать на освобожденную память и любые действия с ними могут иметь неблагоприятные последствия после выделении нового блока памяти.

Функция realloc() возвращает NULL, если память, на которую указывает old_blk, не может быть перевыделена. В этом случае память, на которую указывает old_blk, не освобождается, поэтому желательно сохранить указатель на старый блок памяти, чтобы можно было освободить его позже.

В следующем примере для buffer устанавливается значение NULL, если функция завершается с ошибкой, и buffer не будет указывать на старый блок памяти. Если buffer - единственный указатель на блок памяти, то вы потеряете доступ к этой памяти.

buffer = (char *)realloc( buffer, 100 );

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

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

Если возникла ошибка функция возвращает NULL, код ошибки записывается в errno.

Коды ошибок:

ENOMEM
Недостаточно памяти.
EOK
Успешное завершение.

Примеры:

#include <stdlib.h>
#include <malloc.h>
int main( void )
{
char *buffer;
char *new_buffer;
buffer = (char *)malloc( 80 );
if ( buffer == NULL )
{
return (EXIT_FAILURE);
}
new_buffer = (char *)realloc( buffer, 100 );
if ( new_buffer == NULL )
{
/* Couldn't allocate a larger buffer. Remember that buffer stills
* point to allocated memory -- don't leak it! */
free( buffer );
return (EXIT_FAILURE);
} else {
buffer = new_buffer;
}
return (EXIT_SUCCESS);
}

Переменные окружения:

MALLOC_OPTIONS
Описание см. на странице malloc().

Классификация:

ANSI, POSIX 1003.1

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

calloc(), free(), malloc(), sbrk()




Предыдущий раздел: Описание API системной библиотеки