Как проверить, указывает ли указатель 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);