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
Необходимо следить за тем, как calloc(), malloc(), и realloc() ведут себя при задании size равным 0 (или задании 0 для аргумента n функции calloc()). Столбцы V (“System V”) и R (“поведение realloc() из ЗОСРВ «Нейтрино» 2011 и более ранних версий”) из таблицы ниже указывают на то, как функции ведут себя, если значение MALLOC_OPTIONS включает в себя данный символ:
Функция Значение по умолчанию V R
calloc(n, 0) не NULL NULL Нет имеет эффекта
malloc(0) не NULL NULL Нет имеет эффекта
realloc(NULL, 0) не NULL NULL Нет имеет эффекта
realloc(не NULL, 0) не NULL NULL NULL
Во всех вышеупомянутых случаях, если функция возвращает указатель, отличный от NULL, он действителен только для соответствующего вызова free() или realloc().

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

ANSI, POSIX 1003.1

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

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

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




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