2.56M
Категория: ПрограммированиеПрограммирование

Динамический и статический способы организации переменных. Динамические переменные и массивы. Лекция 6

1.

ЛЕКЦИЯ 6. ДИНАМИЧЕСКИЙ И
СТАТИЧЕСКИЙ СПОСОБЫ ОРГАНИЗАЦИИ
ПЕРЕМЕННЫХ. ДИНАМИЧЕСКИЕ
ПЕРЕМЕННЫЕ И МАССИВЫ.
МАРТЫНЕНКО КИРИЛЛ
КИРИЛЛОВИЧ

2.

СТАТИЧЕСКИЕ И ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ
• В самом широком смысле в языках
программирования они имеют отношение к
моменту связывания свойств объектов
программирования (типов данных,
переменных, функций) с необходимыми для
их существования элементами архитектуры
компьютера (командами, адресами и т.п.).
Связывание статического свойства объекта
происходит при трансляции (компиляции)
программы (транслятором осуществляется
статическое распределение памяти), свойство
является динамическим, если связывание его
происходит при выполнении программы.

3.

РЕЗЮМЕ
• Для статических переменных их количество, типы и размерности
определяются при трансляции и в дальнейшем не меняются.
• Проблема - программа не может превысить лимит памяти,
запланированный при трансляции, иначе ей потребуется
дополнительная память, выделяемая во время выполнения
программы.

4.

СВЯЗЫВАНИЕ ПЕРЕМЕННОЙ С ЕЁ СВОЙСТВАМИ
• Связывание переменной с ее типом всегда происходит при
трансляции. Связывание в ней адреса памяти и значения может
происходить в разное время:
• глобальные (внешние) переменные размещаются в общем сегменте данных и
получают в нем свои адреса уже при трансляции. Аналогично происходит их
инициализация (присваивание начальных значений);
• локальные переменные размещаются в стеке. Поскольку данные в стеке
адресуются относительно текущего положения указателя стека, то при
трансляции определяется смещение в текущем фрейме (кадре) стека,
сформированном при вызове функции. Выделение памяти и, соответственно,
размещение локальных переменных, а также их инициализация происходят во
время выполнения при входе в функцию (продвижением указателя стека).

5.

ЭТАПЫ КОМПИЛЯЦИИ
• Препроцессинг – подстановка include
файлов и переменных define;
• Компиляция (трансляция) –
преобразование кода в ассемблер;
• Ассемблирование – преобразование
ассемблера в машинный код;
• Компоновка (линкер) – связывание всех
объектных файлов и библиотек в
единый исполняемый файл;
• Загрузка – подгрузка динамических
библиотек, загрузка программы в
память.

6.

ДИНАМИЧЕСКИЕ ПЕРЕМЕННЫЕ
• На уровне библиотек в Си создан механизм порождения и
уничтожения переменных самой работающей программой.
• Область памяти, в которой они создаются – динамическая память или
«куча».
• Динамическое распределение памяти (ДРП).

7.

ПРОГРАММА В ПАМЯТИ КОМПЬЮТЕРА
• Стэк – статические и конечные данные,
вызов функций и передача параметров;
• Куча – данные динамических размеров;
• BSS-сегмент (block started by symbol) –
неинициализированные глобальные и
статические переменные;
• Инициализированные данные – глобальные
(global), внешние (extern), статические (static)
и постоянные (const);
• Сегмент кода – исполняемые инструкции на
машинном коде, только для чтения.

8.

ОСНОВНЫЕ СВОЙСТВА ДИНАМИЧЕСКИХ
ПЕРЕМЕННЫХ
• динамические переменные создаются и уничтожаются работающей
программой путем выполнения специальных операторов или вызовов
функций;
• количество и размерность динамических переменных (массивов) может
меняться в процессе работы программы. Это определяется числом вызовов
соответствующих функций их параметрами;
• динамическая переменная не имеет имени, доступ к ней возможен только
через указатель;
• функция создания динамической переменной ищет в «куче» свободную
память необходимого размера и возвращает указатель на нее (адрес);
• функция уничтожения динамической переменной получает указатель на
уничтожаемую переменную.

9.

• Динамическая переменная может, в свою очередь, содержать один
или несколько указателей на другие динамические переменные –
получаем динамические структуры (например, деревья, списки).
• Ошибки:
• Изменение указателя на динамическую переменную;
• ошибки в процессе создания, уничтожения и работы с динамическими
переменными (повторная попытка уничтожения динамической переменной,
попытка уничтожения переменной, не являющейся динамической и т.д.),
приводят к непредсказуемым последствиям в работе программы. Причем
программа «валится» иногда не в том месте, где производятся ошибочные
действия, при последующих вывовах функций работы с библиотекой.

10.

ВЫДЕЛЕНИЕ И ОЧИСТКА ПАМЯТИ
• Библиотека stdlib.h;
• malloc – выделение памяти размером size байтов в куче;
• void * malloc(size_t size);
• Возвращает либо указатель на size байтов памяти, либо NULL;
• Приведение типа;
• free – освобождение памяти в куче;
• сalloc – выделение памяти размером num*size байтов;
• void* calloc(size_t num, size_t size);
• realloc – изменение размера ранее выделенной памяти, аргументы –
указатель, с помощью которого через malloc выделили память, и новое
значение байтов;
• void* realloc(void* ptr, size_t size).

11.

ДИНАМИЧЕСКИЕ МАССИВЫ
#include <malloc.h>
double* pd2 = NULL;
переменных
// Массивы динамических
pd2 = (double*)malloc(n2*sizeof(double));
if (pd2==NULL) return;
for (int i=0; i<n2; i++, pd2++) pd2*=i;
free(pd2);
English     Русский Правила