Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Да, это - зарегистрированное поведение:
Поля объекта всегда инициализируются к 0, 0.0, ", Ложь, ноль или независимо от того, что применяется.
Глобальные переменные всегда инициализируются к 0 и т.д. также;
считаемый на локальную ссылку* переменные всегда инициализируются к нолю или'';
Локальный не считаемый на ссылку* переменные являются неинициализированными, таким образом, необходимо присвоить значение, прежде чем можно будет использовать их.
я помню, что Barry Kelly где-нибудь записал определение для "считаемого на ссылку", но не может больше находить его, таким образом, это должно сделать тем временем:
считаемый на ссылку ==, которые считаются на ссылку самостоятельно, или прямо или косвенно содержат поля (для записей) или элементы (для массивов), которые считаются на ссылку как:
string, variant, interface
или динамический массив или статический массив содержащий такие типы.
Примечания:
record
самостоятельно недостаточно для становления считаемым на ссылку Глобальные переменные, которые не имеют явного инициализатора, выделяются в разделе BSS в исполняемом файле. Они на самом деле не занимают места в EXE; раздел BSS является специальным разделом, который ОС выделяет и очищает для обнуления. В других операционных системах существуют подобные механизмы.
можно зависеть от инициализируемых нулем глобальных переменных.
Поля класса являются нулем по умолчанию. Это документируется так, можно полагаться на него. Локальный стек varaiables не определен, если строка или интерфейс, они не обнуляются.
Так же, как примечание стороны (поскольку Вы плохо знакомы с Delphi): Глобальные переменные могут быть инициализированы непосредственно при объявлении их:
var myGlobal:integer=99;
Вот кавычка от Ray Lischners Delphi вкратце Глава 2
, "Когда Дельфи сначала создает объект, все поля начинаются пустой, то есть, указатели инициализируются к нолю, строки и динамические массивы пусты, числа имеют нуль значения, булевы поля являются Ложью, и Варианты установлены на Неприсвоенный. (См. NewInstance и InitInstance в Главе 5 для деталей.)"
Это верно, что должны быть инициализированы локальные в объеме переменные... Я рассматривал бы комментарий выше того "Глобальные переменные, инициализируются" как сомнительные, пока не предоставлено ссылку - я не верю этому.
редактирование... Barry Kelly говорит, что можно зависеть от них инициализируемый нулем, и так как он находится в команде компилятора Дельфи, я полагаю, что стоит:) Благодарит Barry.
Глобальные переменные и данные экземпляра объекта (поля) всегда инициализируются для обнуления. Локальные переменные в процедурах и методах не инициализируются в Win32 Дельфи; их содержание не определено, пока Вы не присваиваете им значение в коде.
Даже если язык действительно предлагает инициализации по умолчанию, я не полагаю, что необходимо полагаться на них. Инициализация к значению делает его намного более ясным другим разработчикам, которые не могли бы знать об инициализациях по умолчанию на языке и предотвращают проблемы через компиляторы.
From Delphi 2007 справочного файла:
ms-help://borland.bds5/devcommon/variables_xml.html
, "Если Вы явно не инициализируете глобальную переменную, компилятор инициализирует ее к 0".
У меня есть тот мало схватывания с данными ответами. Нули Дельфи пространство памяти globals и недавно-созданных-объектов. В то время как это ОБЫЧНО средство, они инициализируются, существует один случай, где они не: перечислимые типы с определенными значениями. Что, если нуль не является легальным значением??