Безопасно ли приводить указатель на void *, а затем сравнивать с NULL? - PullRequest
1 голос
/ 09 июня 2019

Я работаю над домашней работой, и поскольку наши ограничения действительно строги, мне нужно везде проверять NULL указатели, если я хочу 100%. Поэтому я сделал небольшую встроенную функцию, которая проверяет указатели на NULL:

static inline void exit_on_null(void* ptr, const char* msg) {
    if ( ! ptr ) {
        printf("%s\n", msg);
        exit(1);
    }
}

Теперь я спросил себя: это безопасно? Из стандарта, который я знаю, можно сохранить указатель на void* и обратно и получить исходный указатель. Означает ли это, что void* версия указателя все еще сопоставима с NULL или есть какая-то ошибка, в которой я могу работать? Например, всегда ли верно следующее:

ptr = NULL
(void*) ptr == NULL

1 Ответ

2 голосов
/ 09 июня 2019

Я сам нашел ответ в стандарте:

6.3.2.3 Указатели

4 Преобразование нулевого указателя в другой тип указателя дает нулевой указатель этого типа.Любые два нулевых указателя должны сравниваться равными.

...