Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
В [1 117] C:
void foo()
означает "функцию foo
, взятие неуказанного количества аргументов неуказанного типа" void foo(void)
означает "функцию foo
взятие никаких аргументов" В [1 118] C++ :
void foo()
означает "функцию foo
, взятие никаких аргументов" void foo(void)
означает "функцию foo
взятие никаких аргументов" Путем записи foo(void)
, поэтому, мы достигаем той же интерпретации через оба языка и делаем наши заголовки многоязычными (хотя мы обычно должны делать еще некоторые вещи к заголовкам для создания их действительно межъязыковыми; а именно, оберните их в extern "C"
, если мы компилируем C++).
Я понимаю, что Ваш вопрос принадлежит C++, но когда дело доходит до C ответ может быть найден в K& R, страницы 72-73:
, Кроме того, если объявление функции не включает аргументы, как в
double atof();
, который также взят, чтобы означать, что ничто не должно быть принято об аргументах atof; вся проверка параметра выключена. Это особое значение списка пустого аргумента предназначается, чтобы разрешить более старым программам C компилировать с новыми компиляторами. Но это - плохая идея использовать его с новыми программами. Если функция берет аргументы, объявите их; если это не берет аргументов, используйте пусто.
В C Вы используете пустоту в пустой ссылке на функцию так, чтобы компилятор имел прототип, и тот прототип не имеет "никаких аргументов". В C++ Вы не должны говорить компилятору, что у Вас есть прототип, потому что Вы не можете не учесть прототип.