Как проверить, указывает ли указатель void на NULL?
Итак, если вы это сделаете:
void *ptr = NULL;
, что является лучшим способом, чтобы проверить, если указатель имеет значение null?
Мой обходной путь на данный момент таков:
if (*(void**)ptr == NULL) ...
Но это не кажется лучшим способом, поскольку я неявно предполагаю, что ptr имеет тип void** (чего нет).
5 ответов:
Обязательно включите определение NULL.
#include <stddef.h> void *X = NULL; // do stuff if (X != NULL) // etc.
Если вы включаете
Наконец, интересно посмотреть на определение NULL в<stdio.h>
и подобное, тоstddef.h
автоматически втягивается.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);