int* ptr = NULL; //Is this going to avoid the problem
Это приведет к тому, что ptr
будет указывать на NULL
, который можно явно указать как значение по умолчанию / неинициализированное. Это предотвращает проблему, которую вы описываете, но неосторожный программист все равно может случайно разыменовать нулевой указатель без проверки, вызывая неопределенное поведение.
Основным преимуществом является удобство проверки того, была ли ptr
инициализирована или нет, например:
if (ptr != NULL)
{
// assume it points to something
}
Поскольку это довольно идиоматично, опасно не инициализировать указатель на NULL
. Указатель будет инициализирован значением, отличным от NULL, которое на самом деле не указывает на что-либо реальное. Хуже всего то, что вышеприведенная проверка пройдет, что вызовет еще худшие проблемы, если случится так, что адрес в указателе - это память, к которой вы можете легально получить доступ. В некоторых встроенных средах вы можете иметь доступ к любой части памяти, поэтому вы можете случайно повредить случайные части памяти или случайные части исполняемого кода.