Как проверить, указывает ли указатель void на NULL?


Итак, если вы это сделаете:

void *ptr = NULL;

, что является лучшим способом, чтобы проверить, если указатель имеет значение null?

Мой обходной путь на данный момент таков:

if (*(void**)ptr == NULL) ... 

Но это не кажется лучшим способом, поскольку я неявно предполагаю, что ptr имеет тип void** (чего нет).

5 6

5 ответов:

Я бы просто написал if (!ptr).

NULL в основном это просто 0 и !0 верно.

Обязательно включите определение NULL.

   #include <stddef.h>

   void  *X = NULL;

   // do stuff

   if (X != NULL)  // etc.

Если вы включаете <stdio.h> и подобное, то stddef.h автоматически втягивается.

Наконец, интересно посмотреть на определение NULL в stddef.h, и, сделав это, вы поймете, почему ваша первоначальная догадка о том, что делать, интересна.

Нулевой указатель - это указатель, который никуда не указывает. Его значение обычно определяется в stddef.h следующим образом:

#define NULL ((void*) 0)

Или

#define NULL 0

Поскольку NULL равно нулю, оператор if для проверки того, является ли указатель NULL, проверяет, является ли этот указатель нулем. Следовательно, if (ptr) принимает значение 1, когда указатель не равен нулю, и наоборот, if (!ptr) принимает значение 1, когда указатель равен нулю.

Ваш подход if (*(void**)ptr == NULL) приводит указатель void в качестве указателя на указатель, а затем пытается разыменовать его. Разыменованный указатель на указатель дает указатель, так что это может показаться допустимым подходом. Однако, поскольку ptr равно NULL, при его разыменовании вызывается неопределенное поведение.

Гораздо проще проверить if (ptr == NULL) или, используя краткую нотацию, if (!ptr).

Если ваш код удается скомпилировать при присвоении void *ptr = NULL, то само собой разумеется, что простого оператора if Для сравнения, если это NULL, должно быть достаточно, особенно потому, что NULL должен быть определен, если код может компилироваться.

Пример достаточного способа проверки:

if(ptr==NULL)
{
    rest of code...
}

Я написал небольшую тестовую программу, скомпилированную с gcc на linux, которая работает:

int main()
{
    void *ptr = NULL;
    if(ptr==NULL)
    {
        return 1;
    }
    return 0;
}

Я знаю, что это немного старый пост, но хотел добавить что-то, что может быть полезным.

Обычно я делаю что-то вроде этого,

Это моя функция.

void MyMethod(  const void* l_pData  ///< Source data
              , size_t l_nLen        /**< Number of bytes to convert */) {
    // Return if nothing is provided
    if (l_pData == NULL || ((const char*)(l_pData))[0] == '\0' || 0 == l_nLen) {
        return;
    }

    // Rest of the code
}

Вы можете проверить для

 - Null data
 - Empty data
 - Invalid length

Следующие проверяются

MyMethod("", 10);
MyMethod(" ", 10);
MyMethod(NULL, 10);
MyMethod("valid", 0);