Функция realloc

Прототип функции 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.

CppStudio.com
Введите целое значение (0 — выход): 11
Введите целое значение (0 — выход): 33
Введите целое значение (0 — выход): 55
Введите целое значение (0 — выход): 77
Введите целое значение (0 — выход): 99
Введите целое значение (0 — выход): 0
Введенные числа: 11 33 55 77 99 0
Автор: admin
Дата: 03.09.2012
Поделиться:

Комментарии

  1. AlexZ

    В самом начале в «Описании» серьезная ошибка. Написано:  «Размер блока памяти, изменяется НА size байтов«. Как будто size это разница между новым и старым размером. Но на самом деле size это новый размер всего блока.

    Дальше в описаниях параметров уже написано правильно.

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.