void *realloc(void *ptr, size_t newsize)
Функция realloc() изменяет величину выделенной памяти, на которую указывает ptr, на новую величину, задаваемую параметром newsize. Величина newsize задается в байтах и может быть больше или меньше оригинала. Возвращается указатель на блок памяти, поскольку может возникнуть необходимость переместить блок при возрастании его размера. В таком случае содержимое старого блока копируется в новый блок и информация не теряется.
Если свободной памяти недостаточно для выделения в куче блока размером newsize, то возвращается нулевой указатель.
Следующая программа выделяет 17 байт памяти , копирует строку «this is 16 chars» в эту область , а затем использует функцию realloc ( ) , с тем чтобы увеличить размер блока до 18 байт и поместить в конце точку.
#include
#include
#include
int main ( void )
{
char * p ;
p = ( char * ) malloc ( 17 ) ;
if ( ! p ) {
printf ( «Allocation error.» ) ;
exit ( 1 ) ;
}
strcpy ( p , «This is 16 chars» ) ;
p = ( char * ) realloc ( p , 18 ) ;
if ( ! p ) {
printf ( «Allocation error.» ) ;
exit ( 1 ) ;
}
strcat ( p , «.» ) ;
printf ( p ) ;
free ( p ) ;
return 0 ;
}
Как работает realloc() ?? C++
Я использую realloc и задался вопросом: Эта функция создает новый блок памяти и копирует туда содержимое старого блока, а после возвращает его?? Или она в прямом смысле изменяет блок памяти? Очищает ли она старый блок? Вызовет ли это утечку памяти:
T* ndat = (T*)malloc(sizeof(T) * 5); T* checklink = (T*)realloc(ndat, sizeof(T*) * 7); if (checklink == nullptr) < throw 893242428; >ndat = checklink;
Отслеживать
1,234 9 9 серебряных знаков 18 18 бронзовых знаков
задан 30 мар 2022 в 11:35
98 6 6 бронзовых знаков
Интересно, за что заминусили вопрос?
30 мар 2022 в 12:47
думаю из-за того, что вопрос то по факту о си, а не о с++. От с++ тут только throw с странным кодом.
30 мар 2022 в 12:49
хм. разве что 🙂 ну. можно метки поправить
30 мар 2022 в 12:56
Связанный вопрос: https://ru.stackoverflow.com/q/693925/3380
30 мар 2022 в 17:42
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Функция realloc знает внутреннее устройство менеджера памяти (как и malloc/free) и знает о том, что malloc обычно выделяет чуточку больше памяти, чем просят (сколько именно — личное дело менеджера памяти).
Если памяти в текущем выделенном блоке хватает, то realloc обновляет данные во внутренних структурах (не обязано, но если работает поиск утечек памяти и выхода за границы, то нужно) и возвращает переданный указатель.
Если же памяти не хватает, то выделяет новый блок, копирует туда текущее содержимое, удаляет переданный блок и возвращает указатель на новый блок памяти.
Но это все — обычное ожидаемое поведение. Но никто не мешает менеджеру памяти быть так устроенным, что каждый realloc будет всегда возвращать новый кусок памяти или в том случае, если памяти не хватает в текущем блоке, возвращать ошибку. Для какой то задачи это может быть оправдано (копирование памяти — не быстрый процесс, а если у нас каждый такт на вес золота. )
Realloc – перераспределение памяти

Функция realloc пытается сжать или увеличить предварительно выделенный блок до размера в size байт. Аргумент block указывает на блок памяти, полученный при вызове функций malloc, calloc или realloc. Если block является нулевым указателем, realloc работает также как и malloc.
Функция realloc изменяет размер выделенного блока памяти и при необходимости копирует его содержимое в новый блок.
Возвращаемое значение
Функция realloc возвращает адрес блока, который может отличаться от исходного. Если блок не может быть выделен или size равно 0, то realloc возвращает NULL.
Переносимость
Функция realloc доступна в системах UNIX и поддерживается стандартом ANSI C.
Пример
#include #include #include int main(void) < char *str; /* выделить память под строку */ str = malloc(10); /* скопировать в строку "Hello" */ strcpy(str,"Hello"); /* вывести строку */ printf("Строка: %s\n, Адрес: %p\n",str,str); str = realloc(str,20); printf("Строка: %s\n, Новый адрес: %p\n",str,str); /* освободить память */ free(str); return 0; >
Функция realloc
Функция realloc выполняет перераспределение блоков памяти.
Размер блока памяти, на который ссылается параметр ptrmem изменяется на size байтов. Блок памяти может уменьшаться или увеличиваться в размере.
Эта функция может перемещать блок памяти на новое место, в этом случае функция возвращает указатель на новое место в памяти. Содержание блока памяти сохраняется даже если новый блок имеет меньший размер, чем старый. Отбрасываются только те данные, которые не вместились в новый блок. Если новое значение size больше старого, то содержимое вновь выделенной памяти будет неопределенным.
В случае, если ptrmem равен NULL , функция ведет себя именно так, как функция malloc , т. е. выделяет память и возвращает указатель на этот участок памяти.
В случае, если size равен 0, ранее выделенная память будет освобождена, как если бы была вызвана функция free , и возвращается нулевой указатель.
Параметры:
- ptrmem
Указатель на блок ранее выделенной памяти функциями malloc , calloc или realloc для перемещения в новое место. Если этот параметр — NULL , просто выделяется новый блок, и функция возвращает на него указатель. - size
Новый размер, в байтах, выделяемого блока памяти. Если size равно 0, ранее выделенная память освобождается и функция возвращает нулевой указатель, ptrmem устанавливается в 0.
Возвращаемое значение
Указатель на перераспределенный блок памяти, который может быть либо таким же, как аргумент ptrmem или ссылаться на новое место.
Тип данных возвращаемого значения всегда void* , который может быть приведен к любому другому.
Если функции не удалось выделить требуемый блок памяти, возвращается нулевой указатель, и блок памяти, на который указывает аргумент ptr остается неизменным.
Пример: исходный код программы
//пример использования функции realloc #include #include int main() < int input; int counter = 0; // счетчик введенных чисел int * values = NULL; int * many_numbers; do < std::cout > input; counter++; many_numbers = (int*) realloc (values, counter * sizeof(int)); // при добавлении нового числа, увеличиваем массив на 1 if (many_numbers != NULL) < values = many_numbers; values[counter - 1] = input; // добавить к массиву только что введённое число >else < free (values); // удалить массив std::cout > while (input != 0); // пока не введён 0 std::cout
Пример работы программы
Программа предлагает пользователю ввести числа. Каждый раз, когда новое значение сохраняется в блок памяти, он увеличивается на размер int .
CppStudio.com
Введите целое значение (0 — выход): 11
Введите целое значение (0 — выход): 33
Введите целое значение (0 — выход): 55
Введите целое значение (0 — выход): 77
Введите целое значение (0 — выход): 99
Введите целое значение (0 — выход): 0
Введенные числа: 11 33 55 77 99 0