Процедурное программирование на языке С. Часть 1. Основные понятия языка С: Методические указания к лабораторным работам по курсам «Алгоритмические языки и программирование» и «Процедурное программирование», страница 13

Рассмотрим пример программы, в которой выполняются следующие действия. С клавиатуры вводится  n, количество элементов типа float в   массиве, под который динамически выделяется память, начальный адрес выделенного участка памяти запоминается в переменной B. Значения элементов массива вычисляются по соответствующей  формуле и значению первого элемента массива. Динамически выделяется память под новый массив - инвертированный исходный (т.е. в новом участке памяти элементы исходного массива располагаются в обратном порядке). Значения инвертированного массива, связанного с переменной  C , выводятся на экран.

Пример 3.4.

#include <stdio.h>

#include <stdlib.h>

  void main (void)

{   int j, i,n;       float *B,*C;

    printf("\n Enter n = ");      scanf("%d",&n);

   if ((B=(float*)malloc(n*sizeof(float)))== NULL)

                              {printf("\nError: Out of memory: B=NULL");exit(1);}

  if ((C =(float*)malloc(n*sizeof(float)))== NULL)

                            {printf("\nError: Out of memory: C =NULL");exit(1);}

  *B=2.5;     i=0;

    do {  *(B+i+1)=*(B+i)+(float)(i+1)/2;   i++;      } while (i<n);

    for (j=0;j<i;j++)     *(C+j)=*( B+i-1-j);

   printf("\n New massiv:"); 

   for(i=0;i<n;i++)    printf("\n C[%d] = %f",i,*(C+i)); 

}

3. Функция саlloc(), так же как и функция malloc(), предназначена для выделения участка памяти размером, который задается функции через ее аргументы.

Заголовок функции сalloc() :   void * сalloc (size_tnmemb, size_tsize).

В соответствии с заголовком, функция возвращает указатель на объект любого типа и, в отличие от функции malloc(),   имеет 2 формальных параметра: nmemb и size,  – предназначенные для вычисления размера памяти, необходимой для размещения данных. Размер запрашиваемой памяти – значение выражения nmemb*size вычисляется при выполнении функции саlloc(). Еще одно отличие от функции malloc() – инициализация нулями всех бит выделенной памяти, т.е. если в программе примера 6.5 вместо вызова  функции malloc()   использовать вызов  B=(float*)сalloc(n,sizeof(float), то вывод на экран значений *(B+i), i = 1,…,4 – приведет к появлению на экране четырех нулей.

4. Функция reаlloc() предназначена для изменения размера выделенного ранее в программе участка динамической памяти.

Заголовок функции realloc() :   void * realloc (void *ptr, size_t size) .

В соответствии с заголовком функция возвращает указатель на объект любого типа, и имеет 2 формальных параметра: ptr и size. Параметр ptr указывает на участок выделенной ранее динамической памяти, размер которого должен быть изменен в соответствии со значением второго формального параметра size. При этом содержимое  старого участка памяти копируется в новый участок.

Значение параметра size может быть больше или меньше, чем размер перераспределяемой области. При этом, если размер нового участка больше размера старого, его адрес может совпадать с адресом старого участка только в случае, если за границей старого участка имеется еще не зарезервированная область необходимого объема. Даже в случае, когда reаlloc() «усекает» область, адрес новой области может не совпадать с адресом старой.

Так же, как и функции mаlloc() и саlloc(), в случае невозможности выполнить запрос программы функция realloc() возвращает NULL,  и вызов функции

ptr = realloc (ptr, new_ size);

может привести к потере всех данных, записанных в старом участке памяти, начиная с адреса ptr. Поэтому, чтобы избежать потери данных, следует использовать следующий прием, учитывая, что вспомогательная переменная ptr_1 и переменная ptr  должны иметь одинаковый тип.

ptr_1 = realloc (ptr, new_ size);

                                 if (ptr_1 != NULL) ptr = ptr_1; else …