Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


Динамическое выделение памяти




Статическими называются такие величины, память под которые выделяется во время компиляции и сохраняется в течение всей работы программы.

Существует и другой способ выделения памяти под данные, который называется динамическим. В этом случае память под величины отводится во время выполнения программы. Такие величины будем называть динамическими.

Раздел оперативной памяти, распределяемый статически, называется статической памятью; динамически распределяемый раздел памяти называется динамической памятью.

Динамическая память - это область памяти, выделенная для нужд программы в процессе работы программы (а не заранее).

Использование динамических величин предоставляет программисту ряд дополнительных возможностей. Во-первых, подключение динамической памяти позволяет увеличить объем обрабатываемых данных. Во-вторых, если потребность в каких-то данных отпала до окончания программы, то занятую ими память можно освободить для другой информации. В-третьих, использование динамической памяти позволяет создавать структуры данных переменного размера.

Динамическая переменная хранится в некоторой области ОП, обращение к которой производится через переменную-указатель. Указатель содержит адрес поля в динамической памяти, хранящего величину определенного типа. Сам указатель располагается в статической памяти.

Работа с динамическими данными замедляет выполнение программы, поскольку доступ к величине происходит в два шага: сначала ищется указатель, затем по нему — величина: выигрыш в памяти компенсируется проигрышем во времени.

Основными двумя действиями над динамической памятью являются: выделение и освобождение. В языке С функции для осуществления этих действий описаны в библиотеке stdlib.h.

Функция выделения блока памяти:

void * malloc(size);

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

Так как все функции, работающие с динамической памятью, возвращают не типизированные указатели, то для присвоения их значений типизированным указателям необходимо производить операцию приведения типа:

int *v;

v=(int*)malloc(sizeof(int));

Функция выделения блока памяти под массив:

void * calloc(num, size);

В первом параметре num (целое незнаковое число) передается число элементов в массиве. Во втором параметре size (целое незнаковое число) передается размер одного элемента массива. Функция возвращает значение не типизированного указателя на выделенный блок памяти, или значение NULL, если блок памяти заданного объема выделить не удалось.

Например, фрагмент программы для выделения динамической памяти под целочисленный массив из 20 элементов:

int *array = (int *)calloc(20,sizeof(int));

Функции calloc и malloc взаимозаменяемы.

Функция освобождения динамической памяти:

void free(void *block);

В параметре block (не типизированный указатель) в функцию передается указатель на выделенный ранее блок памяти. Функция не возвращает никакого значения.

Например, освобождение блока памяти,: free(array);


Поделиться:

Дата добавления: 2015-04-18; просмотров: 78; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.006 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты