Прототип функции realloc:
void * realloc( void * ptrmem, size_t size );
| Название | Язык |
|---|---|
| stdlib.h | С |
| cstdlib | С++ |
Описание
Функция 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 <iostream>
#include <cstdlib>
int main()
{
int input;
int counter = 0; // счетчик введенных чисел
int * values = NULL;
int * many_numbers;
do {
std::cout << "Введите целое значение (0 - выход): ";
std::cin >> 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 << "Ошибка перевыделения памяти!";
exit (1); // завершить работу программы
}
} while (input != 0); // пока не введён 0
std::cout << "Введенные числа: ";
for (int ix = 0; ix < counter; ix++) std::cout << values[ix] << " ";
free (values); // удалить массив
return 0;
}
Пример работы программы
Программа предлагает пользователю ввести числа. Каждый раз, когда новое значение сохраняется в блок памяти, он увеличивается на размер int.
Введите целое значение (0 — выход): 33
Введите целое значение (0 — выход): 55
Введите целое значение (0 — выход): 77
Введите целое значение (0 — выход): 99
Введите целое значение (0 — выход): 0
Введенные числа: 11 33 55 77 99 0
Комментарии
AlexZ
В самом начале в «Описании» серьезная ошибка. Написано: «Размер блока памяти, изменяется НА
sizeбайтов«. Как будто size это разница между новым и старым размером. Но на самом деле size это новый размер всего блока.Дальше в описаниях параметров уже написано правильно.