Содержание | Глава 17

Функция realloc

#include <stdlib.h>
void *realloc(void *ptr, size_t size);

Действие функции realloc() в версии С99 немного отличается от ее работы o С89, хотя конечный результат одинаков. В С89 функция realloc() изменяет размер блока ранее выделенной памяти, адресуемой указателем ptr в соответствии с заданным размером size. Значение параметра size может быть больше или меньше, чем перераспределяемая область. Функция realloc() возвращает указатель на блок памяти, по скольку не исключена необходимость перемещения этого блока (например при увеличении размера блока памяти). В этом случае содержимое старого блока (до size байтов) копируется в новый блок.

В версии С99 блок памяти, адресуемый параметром ptr, освобождается, а вместо него выделяется новый блок. Содержимое нового блока совпадает с содержимым исходного (по крайней мере совпадают первые size байтов). Функция возвращает указатель на новый блок. Причем допускается, чтобы новый и старый блоки начинались с одинакового адреса (т.е. указатель, возвращаемый функцией realloc(), может совпадать с указателем, переданным в параметре ptr).

Если указатель ptr нулевой, функция realloc() просто выделяет size байтов памяти и возвращает указатель на эту память. Если значение параметра size равно нулю, память, адресуемая параметром ptr, освобождается.

Если в динамически распределяемой области памяти нет достаточного объема свободной памяти для выделения size байтов, возвращается нулевой указатель, а исходный блок памяти остается неизменным.

Пример

Эта программа сначала выделяет блок памяти для 17 символов, копирует в них строку "Это - 17 символов", а затем использует realloc() для увеличения размера блока до 18 символов, чтобы разместить в конце точку.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
  char *p;

  p = malloc(17);
  if(!p) {
    printf("Ошибка при распределении памяти\n");
    exit(1);
  }

  strcpy(p, "Это - 17 символов");

  p = realloc(p, 18);
  if(!p) {
    printf("Ошибка при распределении памяти\n");
    exit(1);
  }

  strcat(p, ".");

  printf(p);

  free(p);

  return 0;
}

Зависимые функции

free() malloc() calloc()
Содержание | Глава 17