Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
«Файл заголовка» фактически вставляется препроцессором перед началом компиляции. Просто думайте об этом как о «замене» его директивы #include
.
Страж ...
#ifndef MY_HEADER_H
#define MY_HEADER_H
....
#endif
... выполняется после замены. Таким образом, заголовок может фактически быть включен несколько раз, но «защищенная» часть текста передается компилятору только один раз препроцессором.
Итак, если в заголовке есть какие-либо определения генерации кода, они, разумеется, будут включены в объектный файл модуля компиляции (он же «модуль»). Если один и тот же заголовок имеет значение #include
в нескольких модулях, они появятся несколько раз.
Для определений static
это совсем не проблема, так как они не будут видны за пределами модуля (он же область действия файла ). Для глобальных программных определений это отличается и приведет к ошибке «множественные определения».
Примечание: это в основном для C . Для C ++ есть существенные различия, поскольку классы и т. Д. Добавляют дополнительную сложность тому, что / когда допускается несколько глобальных объектов.
Заголовочный файл будет включен один раз на единицу перевода, да. Он может быть включен несколько раз для каждой программы, поскольку каждый блок перевода обрабатывается отдельно для процесса компиляции. Они объединяются в процессе связывания, чтобы сформировать законченную программу.