Выделить, перевыделить или освободить область памяти
#include <stdlib.h>void * realloc( void *old_blk,size_t size );
libc
Функция realloc() выделяет, перевыделяет или освобождает область памяти, указанную в old_blk, основываясь на правилах, описанных далее. Вы можете частично контролировать поведение функции с помощью переменной окружения MALLOC
OPTIONS.
NULL
и size не равен 0
, realloc() выделяет новую область памяти размером size байт.
NULL
и size равен 0
, поведение по умолчанию - вернуть указатель, отличный от NULL
, который действителен только для соответствующего вызова free() или realloc(). Не стоит предполагать, что этот указатель указывает на любую допустимую память. Если значение MALLOC_OPTIONS
содержит V
, realloc() возвращает указатель NULL
. Эта переменная окружения также влияет на calloc() и malloc(). Это известно как поведение «System V».
NULL
и size равен 0
, по умолчанию возвращается действительный указатель, отличный от NULL
, который действителен только для соответствующего вызова free() или realloc(). Не стоит предполагать, что этот указатель указывает на любую допустимую память. Если значение MALLOC_OPTIONS
содержит R
илиV
, realloc() вызывает free() для освобождения памяти, на которую указывает old_blk, а затем возвращает NULL
.
Функция realloc() выделяет память из кучи. Используйте free() или realloc(), чтобы освободить блок памяти.
|
Функция realloc() возвращает NULL
, если память, на которую указывает old_blk, не может быть перевыделена. В этом случае память, на которую указывает old_blk, не освобождается, поэтому желательно сохранить указатель на старый блок памяти, чтобы можно было освободить его позже.
В следующем примере для buffer устанавливается значение NULL
, если функция завершается с ошибкой, и buffer не будет указывать на старый блок памяти. Если buffer - единственный указатель на блок памяти, то вы потеряете доступ к этой памяти.
buffer = (char *)realloc( buffer, 100 );
Указатель на начало выделенной памяти.
Если возникла ошибка функция возвращает NULL
, код ошибки записывается в errno.
#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);}
ANSI, POSIX 1003.1
calloc(), free(), malloc(), sbrk()
Предыдущий раздел: Описание API системной библиотеки