Similar presentations:
Динамический и статический способы организации переменных. Динамические переменные и массивы. Лекция 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);