ТЕОРЕТИЧЕСКАЯ ЧАСТЬ. Динамическая память – это оперативная память компьютера, предоставляемая программе при ее работе
Динамическая память – это оперативная память компьютера, предоставляемая программе при ее работе. Динамическое размещение данных означает использование этой памяти при работе программы. Статическое размещение (например, явное определение массива данных заданного типа) осуществляется компилятором в процессе компиляции (запуска) программы. Указатели используются для динамического выделения памяти компьютера при хранении данных [1]. Динамическое распределение означает, что программа выделяет память для данных во время выполнения. Память, выделяемая в С функциями динамического распределения данных, находится в так называемой динамически распределяемой области памяти (англ. heap – «куча») [1]. Динамически распределяемая область памяти – это свободная область памяти, не используемая программой, операционной системой или другими программами. Ее размер заранее неизвестен, но, как правило, в ней достаточно места для размещения данных программы. Хотя размер динамически распределяемой области памяти очень большой, все же она конечна и может быть исчерпана. Основу системы динамического распределения памяти в С составляют библиотечные функции calloc(), malloc(), realloc() и free() [1].
9.1. Функция calloc()
Прототип функции с необходимой библиотекой имеет вид #include <stdlib.h> void *calloc(size_t num, size_t size); Функция calloc() выделяет память, размер которой равен значению выражения num * size, т. е. память, достаточную для размещения массива, содержащего num объектов размером size [1]. Выделенная область памяти обнуляется. Функция calloc() возвращает указатель на первый байт выделенной области памяти для массива num объектов, каждый из которых имеет размер size или NULL, если запрос на память выполнить нельзя [2]. Если для удовлетворения запроса нет достаточного объема памяти, возвращается нулевой указатель. Перед попыткой использовать распределенную память важно проверить, что возвращаемое значение не равно нулю. Тип void может быть переопределен для требуемого типа, т. е. для char, int, float, double. Пример фрагмента программного кода динамического распределения памяти для массивов заданного размера, который вводится с клавиатуры: double *ptr; ptr = (double *) (calloc(10, sizeof(double)));
|