Borland Pascal. Руководство пользователя

       

Разыменование неинициализированных указателей


Одним из общих источников ошибок при работе с указателями является разыменование указателя, который еще не был инициализи- рован. Как и в случае других переменных Паскаля, значение пере- менной-указателя не будет определено, пока вы не присвоите ей значение, так что она сможет указывать на какой-то адрес в памя- ти.

Перед использованием указателей им всегда нужно присваивать значения. Если вы разыменовываете указатель, которому еще не присвоено значение, то считанные из него данные могут представ- лять собой случайные биты, а присваивание значения указываемому элементу может затереть другие данные, вашу программу или даже операционную систему. Это звучит несколько пугающе, но при опре- деленной дисциплине такие вещи легко отслеживаются.

Использование пустого указателя

Чтобы избежать разыменования указателей, которые не указыва- ют на что-либо значащее, нужен некоторый способ информирования о том, что указатель недопустим. В Паскале предусмотрено зарезерви- рованное слово nil, которое вы можете использовать в качестве со- держательного значения указателей, которые в данный момент ни на что не указывают. Указатель nil является допустимым, но ни с чем не связанным. Перед разыменованием указателя вы должны убедиться, что он отличен от nil (не пуст).

Предположим, например, что у вас есть функция, возвращающая указатель на некоторый элемент в памяти. Вы можете указать, что такая функция не может найти элемент, возвращая значение nil.

var ItemPointer: Pointer;

function FindIten: Pointer; begin . . . { найти элемент, возвращая указатель на него или nil, если элемент не найден }

end;

begin ItemPointer := nil; { начнем в предположении nil } ItemPointer := FindItem; { вызвать функцию } if ItemPointer <> nil then ... { для надежности разымено- вания ItemPointer } end.



Содержание раздела