Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SPO / LAB1_PAS / Lab1_SPO_PAS.doc
Скачиваний:
25
Добавлен:
26.03.2015
Размер:
183.3 Кб
Скачать

3. Динамическое размещение данных

Динамическое размещение данных предусматривает использование динамической памяти.

Динамическая память (куча) – это часть оперативной памяти компьютера, предоставляемой программе при ее работе, за вычетом сегмента данных (не более 64 Кбайт), стека (16 Кбайт по умолчанию), памяти, используемой системными и резидентными программами, и кода исполняемой программы. По умолчанию размер динамической памяти зависит от всей доступной оперативной памяти компьютера (не менее 200 – 300 Кбайт, а обычно существенно больше).

Размер динамической памяти можно устанавливать из среды TURBO PASCAL или из самой программы специальными директивами компилятора.

Куча (HEAP-область) первоначально всегда свободна и заполняется от нижних адресов в области кучи. Состояние кучи можно отслеживать при помощи специально предопределённых в языке Pascal переменных типа указатель (Pointer):

  • HeapOrg содержит адрес начала кучи, и её значение не изменяется в процессе выполнения программы;

  • HeapPtr содержит адрес начала непрерывного, ещё неиспользованного участка кучи, и каждый раз, когда в куче размещается новая величина, значение этого указателя изменяется на размер этой переменной;

  • HeapEnd содержит адрес конца кучи;

  • FreeList – переменная модуля System, которая указывает на список свободных блоков динамически распределяемой области памяти.

4. Указатели

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

Указатель – это переменная, которая в качестве своего значения содержит адрес какого-либо байта памяти, который задается совокупностью двух шестнадцатиразрядных слов, называемых сегментом (участок памяти, имеющий длину 64 Кбайт и начинающийся с физического адреса, кратного 16: 0, 16, 32 и т. д.) и смещением (указывает, сколько байт от начала сегмента необходимо пропустить, чтобы обратиться к нужному адресу).

Таким образом, значения указателей представляются в виде двух величин типа Word (сегмент:смещение) и занимают 4 байта. Их нельзя ввести с клавиатуры и вывести на устройства вывода.

Для значений указателей предопределена константа Nil, которая называется пустым указателем, и её значение представляется как 0000:0000.

Существует два вида указателей: типизированные и нетипизированные. Они между собой совместимы, но несовместимы те величины, на которые они указывают. Типизированный указатель содержит адрес переменной определенного типа. Нетипизированный указатель может указывать на переменную любого типа.

4.1. Описание указателя.

4.1.1. Типизированные указатели описываются как

^<имя_базового_типа>;

4.1.2. Нетипизированные указатели описываются с помощью стандартного идентификатора Pointer.

Var

P: Pointer;

4.2. Выделение динамической памяти.

4.2.1. Выделение динамической памяти для данных, связанных с типизированным указателем, – с помощью процедуры

New(<идетификатор_указателя>);

Размер выделяемой области памяти определяется базовым типом переменной, связанной с указателем.

Var

P: ^integer;

begin

New(P);

end.

4.2.2. Выделение динамической памяти для данных, связанных с любым видом указателей, – с помощью процедуры

GetMem(<идентификатор_указателя>,<размер_выделяемой_памяти>);

идентификатор_указателя – типизированный или нетипизированный указатель

размер_выделяемой_памяти – величина типа Word, которая определяет количество выделяемой динамической памяти

Память под динамические переменные при использовании процедур New и GetMem выделяется блоками по 8 байт.

Var

P: Pointer;

Begin

GetMem(P,56);

end.

Соседние файлы в папке LAB1_PAS