Прототип функции 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 это новый размер всего блока.Дальше в описаниях параметров уже написано правильно.