logo
Подбельский Фомин_Программирование на языке СИ_

Динамическая память

Динамическая память - это память, выделяемая в процессе выполнения программы. А вот на вопрос: "Глобальный или локальный объект размещен в динамической памяти?" попытаемся найти правильный ответ.

После выделения динамической памяти она сохраняется до ее явного освобождения, что может быть выполнено только с помощью специальной библиотечной функции free( ).

Если динамическая память не была освобождена до окончания выполнения программы, то она освобождается автоматически при завершении программы. Тем не менее явное освобождение ставшей ненужной памяти является признаком хорошего стиля программирования.

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

• указатель (на участок динамической памяти) определен как локальный объект автоматической памяти. В этом случае выделенная память будет недоступна при выходе за пределы блока локализации указателя, и ее нужно освободить перед выходом из блока;

• указатель определен как локальный объект статической памяти. Динамическая память, выделенная однократно в блоке, доступна через указатель при каждом повторном входе в блок. Память нужно освободить только по окончании ее использования;

• указатель является глобальным объектом по отношению к блоку. Динамическая память доступна во всех блоках, где "виден" указатель. Память нужно освободить только по окончании ее использования.

Проиллюстрируем второй вариант, когда объект динамической памяти связан со статическим внутренним (локализованным) указателем:

Результат выполнения программы:

Некоторая небрежность предыдущей программы - выделенный функцией malloc( ) участок памяти явно не освобождается функцией free( ).

В следующей программе указатель на динамический участок памяти — глобальный объект:

Результат выполнения программы:

Динамический объект создается в основной функции и связывается с указателем uk. Там же он явным присваиванием получает начальное значение 'А'. За счет глобальности указателя динамический объект доступен в обоих функциях main( ) и dynam 1 ( ). При выполнении цикла в функции main( ) и внутри функции dynam 1 ( ) изменяется значение динамического объекта.

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