Выделить, перевыделить или освободить область памяти
#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 системной библиотеки