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

1. Функция coreleft() позволяет определить общий объем динамической памяти, доступный программе к моменту ее (функции) вызова и имеет заголовок:

unsignedlongcoreleft(void).

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

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

В соответствии с заголовком функция возвращает указатель на объект любого типа, а единственный формальный параметр size предназначен для размера памяти, необходимой для размещения данных. Тип формального параметра –  size_t, это специальный тип: тип результата, порождаемого операцией вычисления размера объекта sizeof(). Тип size_t определен в <stdlib.h> как некоторый целый без знака.

После вызова функция malloc() осуществляет в области динамической памяти (куче - heap) поиск непрерывного участка  памяти заданного размера и при успешном выполнении возвращает начальный адрес найденного участка, т.е. адрес первого байта из найденных. Если в динамически распределяемой области памяти недостаточно свободной памяти для выполнения запроса, то функция malloc() возвращает NULL.

Для правильного вычисления размера памяти (а значит, для корректной работы программы в разных реализациях) следует использовать операцию sizeof(), определяющую размер одного объекта определенного типа из всей совокупности объектов, для которых запрашивается память.

Допустим, следует выделить участок памяти для N объектов типа type. Если тип type не является базовым или допустимым производным (в частности, указателем на любой тип), то он должен быть определен в программе предварительно. Значение переменной N , имеющее тип int, должно быть вычислено перед вызовом  функции malloc() с фактическим параметром – выражением   N* sizeof(type).  В данном выражении вместо N можно использовать любые другие выражения, но с непременными условиями:

·  каждое из допустимых выражений использует константы или переменные, значения которых определены до вызова функции malloc();

·  тип результата в допустимых выражениях – int.

Функции malloc() вернет в точку вызова начальный адрес выделенного участка памяти размера N* sizeof(type).  Для того чтобы программа получила возможность использовать найденные байты по своему усмотрению,  начальный адрес –  результат работы функции malloc() –  следует сохранить в некоторой переменной программы. Как объявить эту переменную, допустим, с именем ptr?

type  *   ptr;            Переменная  ptr  очевидно должна быть указателем ,

 


              т.к. в ней будет храниться адрес некоторого объекта.

                                          Тип этого объекта (т.е. используемый ранее тип type)

 


 следует добавить в объявление переменной ptr.

В соответствии с заголовком тип функции malloc()  –   void *, указатель на объект любого типа, поэтому для корректной работы программы рекомендуется вызывать функцию malloc()  с приведением типа (type *). Таким образом,  программа обязательно должна содержать следующие операторы:

Оператор создания типа type.

type  *   ptr;

Операторы объявления и определения переменной N .

ptr = (type *)malloc(N* sizeof(type)).

Учитывая, что в случае отсутствия свободной динамической памяти функция malloc() возвращает NULL, в программе следует предусмотреть действия, выполняемые в таком случае. Поэтому после вызова malloc() следует добавить в программу, например, следующие операторы:

if (!ptr) {printf(“\n Out of memory: ptr = NULL”); exit(1);}

Вместо выхода из программы exit(1); можно использовать любые другие операторы действия в таком случае. Обязательным является лишь требование не использовать далее переменную ptr.