Я прочитал эту претензию в тему форума, связанную с в комментарии от @jsantander:
Имейте в виду, что когда вы назначаете или сравниваете указатель на ноль, есть некоторая специальная магия, которая происходит за кулисами, чтобы использовать правильный шаблон для данного указателя (который может фактически не быть нулевым). Это одна из причин, почему такие вещи, как
#define NULL (void*)0
, являются злыми - если вы сравниваетеchar*
сNULL
, что магия явно (и, вероятно, неосознанно) отключена, и может произойти недопустимый результат. Просто чтобы быть более ясным:(my_char_ptr == 0) != (my_char_ptr == (void*)0)
Итак, как я понимаю, для архитектуры, где указатель NULL, скажем, 0xffff
, код if (ptr)
, сравнивает ptr с 0xffff
, а не с 0.
Это правда? Описывается ли это стандартом С++?
Если true, это означает, что 0 можно безопасно использовать даже для архитектур, которые имеют ненулевое значение указателя NULL.
Edit
В качестве дополнительного пояснения рассмотрите этот код:
char *ptr;
memset(&ptr, 0, sizeof(ptr));
if ((ptr == (void*)0) && (ptr != 0)) {
printf("It can happen.\n");
}
Вот как я понимаю утверждение этого сообщения на форуме.