Направления программирования. История создания языка Си. Особенности языка, страница 29

Если в процессе выполнения программы динамический объект, созданный процедурой NEW, становится ненужным, то можно отказаться от выделенного для него места в памяти с помощью процедуры DISPOSE.

В результате выполнения процедуры DISPOSE(P), динамический  объект, на который ссылается указатель P, прекращает своё существование, занимаемое им место в памяти считается свободным, а значение указателя P становится неопределенным.

В Турбо Паскале существуют и другие процедуры для работы с динамической памятью:

-  Процедура  GETMEN(P: PIONTER, SIZE: WORD) где P – указатель, SIZE – размер выделяемой области памяти в байтах. Данная процедура выделяет память под динамические переменные блоками по 8 байт.  

-  Процедура FREEMEN (P,SIZE) – освобождает занятую область памяти содержимым, задаваемым указателем P и размером SIZE байтов.

Пример:

Создание динамического массива (массива с заранее не заданным числом элементов)

TYPE   D = ARRAY [1..2] OF REAL;

VAR A: ^D;

N,I: WORD;

BEGIN

{$R-} {выключение проверки значения индекса массива}

WRITE (‘Ввод размерности массива’);

READLN (N);

GETMEN (A, N*6);  {6- число байтов занимаемое переменной типа REAL}

FOR  I:=1 TO  N  DO

A^[ I ] := 0;

- - - - - - FREEMEN (A, N*6);

{$TR+}

END.

Замечание:  Если в примере используется метод распределения памяти с помощью процедур GETMEN и FREEMEN, то вызовы этих процедур должны соответствовать друг другу, а значение SIZE  при обращении к одному и тому же указателю должно совпадать.

п. 17.3. Операции на указатели.

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

Операции присваивания:

Указателю можно присвоить:

-  содержимое другого указателя того же типа;

-  константу NIL;

-  адрес объекта, определенный с помощью функции  ADDR (или оператора @);

Пример: VAR   N: INTEGER;

P1,P2: ^ INTEGER;

P3: ^ REAL;

P: PIONTER;

Допустимо присваивание:

P1:=P2;    P1:=NIL; P2:=@N; P:=P1; P2:=P;

Недопустимо присваивание:               

P1:=P3;

Операции сравнения: ‘=’,  ‘<’,  ’>’.

Два указателя равны,  если они оба есть NIL, либо указывают на один и тот же динамический  объект.

Во всех остальных случаях имеет место неравенство.

п. 17.4. Распределение ОП в языке Паскаль и Си.

Память в ПЭВМ адресуется двумя шестнадцатеричными словами (BA: BS), где

BA – сегментный адрес;  BS – смещение.

Сегмент – это участок памяти длиной 64 Кбайта, который начинается с физического адреса, значение которого кратно числу  16.

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

Схемы распределения ОП.

а) В Турбо Паскале

EXE файл

Префикс сегмента программы

Младшие – Старшие адреса

Кодовый сегмент главной программы

Кодовый сегмент последующего модуля

Обратный порядок списка USES

- - - - - - -

Кодовый сегмент первого модуля

Кодовый сегмент SISTEM

Сегмент данных и главных переменных

Стек

Свободный стек

Оверлейный буфер

Heap Org

ДРОП

Динамическая область

Heap Ptr

Свободная память динамической области

Free Ptr

Свободная память

б) В Турбо Си

Код программы

Младшие – Старшие адреса

Статические данные

(глобальные переменные и константы)

Куча

Свободная память

Стек