wake-up-neo.com

Wie überprüfe ich, ob der Void-Zeiger auf NULL zeigt?

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).

7
pyrrhic

Ich würde einfach if (!ptr) schreiben.

NULL ist im Grunde nur 0 und !0 ist wahr.

11
nmaier

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.

6
JackCColeman

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)

2
verbose

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;
}
1
xt454

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);
0
SajithP