Рассмотрим пример программы, в которой выполняются следующие действия. С клавиатуры вводится 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 …
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.