Указатель NULL - это указатель, который не указывает нигде. Его значение, как правило, определяется в stddef.h
следующим образом:
#define NULL ((void*) 0)
или
#define NULL 0
Поскольку NULL равен нулю, if
заявление, чтобы проверить, является ли NULL указатель проверки, является ли этот указатель равен нулю. Следовательно, if (ptr)
оценивает 1, когда указатель не равен NULL, и, наоборот, if (!ptr)
оценивает 1, когда указатель имеет значение NULL.
Ваш подход if (*(void**)ptr == NULL)
направляет указатель void
в качестве указателя на указатель, а затем пытается разыменовать его. Разделенный указатель на указатель дает указатель, поэтому он может показаться действительным подходом. Однако, поскольку ptr
имеет значение NULL, когда вы его разыскиваете, вы вызываете неопределенное поведение.
Гораздо проще проверить if (ptr == NULL)
или, используя краткую нотацию, if (!ptr)
.
Почему так сделать суету об этом –
Читайте: [Могу ли я использовать 'если (указатель)' вместо 'если (указатель! = NULL) '?] (http://stackoverflow.com/questions/17772103/can-i-use-ifpointer-instead-of-ifpointer-null) –
Обходное решение для * what *? – GManNickG