Иллюстрированный самоучитель по Tirbo Pascal



              

Выделение и освобождение динамической память - часть 4


Нетрудно обнаружить, что наличие нетипизированных указателей в Турбо Паскале I в стандартном Паскале их нет) открывает широкие возможности неявного преобразования типов. К сожалению, трудно обнаруживаемые ошибки в программе, связанные с некорректно используемыми обращениями к процедурам NEW и DISPOSE, также могут привести к нежелательному преобразованию типов. В самом деле, пусть имеется программа:

var

i,j : Integer; 

r : Real; 

begin

new(i); {i := HeapOrg; HeapPtr:= HeapOrg + 2}

j := i; {j := HeapOrg} 

j := 2;

dispose(i); {HeapPtr := HeapOrg} 

new(r); {r := HeapOrg; HeapPtr:= HeapOrg + 6}

r := pi; 

WriteLn(j) 

end.

Что будет выведено на экран дисплея? Чтобы ответить на этот вопрос, проследим за значениями указателя HEAPPTR. Перед исполнением программы этот указатель имел значение адреса начала кучи HEAPORG, которое и было передано указателю I, азатем и J. После выполнения DISPOSE(I) указатель кучи вновь приобрел значение HEAPORG, этот адрес передан указателю R в процедуре NEW(R). После того как по адресу R разместилось вещественное число pi=3.14159, первые 2 байта кучи оказались заняты под часть внутреннего представления этого числа. В то же время J все еще сохраняет адрес HEAPORG, поэтому оператор WRITELN(J^) будет рассматривать 2 байта числа pi как внутреннее представление целого числа (ведь J - это указатель на тип INTEGER) и выведет 8578.




Содержание  Назад  Вперед