Also, wenn Sie dies tun:
void *ptr = NULL;
Was ist der beste Weg, um zu überprüfen, ob dieser leere Zeiger NULL ist?
Meine Problemumgehung für den Moment lautet wie folgt:
if (*(void**)ptr == NULL) ...
Dies scheint jedoch nicht der beste Weg zu sein, da ich implizit annehme, dass ptr vom Typ void ** ist (was es nicht ist).
Ich würde einfach if (!ptr)
schreiben.
NULL
ist im Grunde nur 0
und !0
ist wahr.
Stellen Sie sicher, dass Sie eine Definition von NULL angeben.
#include <stddef.h>
void *X = NULL;
// do stuff
if (X != NULL) // etc.
Wenn Sie <stdio.h>
und ähnliches angeben, wird stddef.h
automatisch eingezogen.
Schließlich ist es interessant, die Definition von NULL in stddef.h
zu betrachten, und Sie werden sehen, warum Ihre erste Vermutung, was zu tun ist, interessant ist.
Ein NULL-Zeiger ist ein Zeiger, der nirgendwohin zeigt. Sein Wert wird normalerweise in stddef.h
wie folgt definiert:
#define NULL ((void*) 0)
oder
#define NULL 0
Da NULL Null ist, prüft eine if
-Anweisung, ob ein Zeiger NULL ist, ob dieser Zeiger Null ist. Daher wird if (ptr)
zu 1 ausgewertet, wenn der Zeiger nicht NULL ist, und umgekehrt wird if (!ptr)
zu 1 ausgewertet, wenn der Zeiger NULL ist.
Ihr Ansatz if (*(void**)ptr == NULL)
wandelt den void
-Zeiger als Zeiger auf einen Zeiger um und versucht dann, ihn zu dereferenzieren. Ein dereferenzierter Zeiger-zu-Zeiger liefert einen Zeiger, sodass er wie ein gültiger Ansatz erscheint. Da ptr
jedoch NULL ist, rufen Sie beim Dereferenzieren ein undefiniertes Verhalten auf.
Es ist viel einfacher, if (ptr == NULL)
zu überprüfen, oder if (!ptr)
.
Wenn es Ihrem Code gelingt, bei der Zuweisung von void *ptr = NULL
zu kompilieren, ist es naheliegend, dass eine einfache if
-Anweisung zum Vergleichen, ob es sich um NULL
handelt, ausreichend ist, zumal NULL
definiert werden müsste, wenn der Code kompiliert werden kann.
Beispiel einer ausreichenden Möglichkeit zur Überprüfung:
if(ptr==NULL)
{
rest of code...
}
Ich habe ein kleines Testprogramm geschrieben, das mit gcc unter Linux kompiliert wurde und das funktioniert:
int main()
{
void *ptr = NULL;
if(ptr==NULL)
{
return 1;
}
return 0;
}
Ich weiß, dass dies ein etwas alter Beitrag ist, aber ich wollte etwas hinzufügen, das nützlich sein könnte.
Was ich normalerweise mache, ist so etwas,
Das ist meine Funktion.
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
}
Sie können nachsehen
- Null data
- Empty data
- Invalid length
Folgende sind validiert
MyMethod("", 10);
MyMethod(" ", 10);
MyMethod(NULL, 10);
MyMethod("valid", 0);