Es sollte wahrscheinlich ein Cast zu einem void pointer sein, was dasselbe wie einfach "Pointer" bedeutet (d. h. ein Zeiger auf jeden Typ):
if (ptr != (void *)(NULL)) {
...
}
Obwohl der Cast unnötig ist:
if (ptr != NULL) {
...
}
Ihr Code kompiliert nicht einmal auf meinem System (Mac mit GCC 4.2.1), die Fehlermeldung, die GCC meldet, lautet void value not ignored as it ought to be
. Das ist zu erwarten, da void
bedeutet kein Wert/Typ überhaupt, und Sie können das nicht mit etwas anderem vergleichen.
Das besagt der C99-Standard:
§6.3.2.2 void
1 Der (nicht existierende) Wert eines void-Ausdrucks (eines Ausdrucks mit dem Typ void) darf in keiner Weise verwendet werden, und implizite oder explizite Umwandlungen (außer zu void) dürfen auf solch einem Ausdruck nicht angewendet werden. Wird ein Ausdruck eines anderen Typs als ein void-Ausdruck bewertet, wird sein Wert oder Bezeichner verworfen. (Ein void-Ausdruck wird für seine Seiteneffekte bewertet.)
§6.5.9 Gleichheitsoperatoren
Einschränkungen
2 Eine der folgenden Bedingungen muss erfüllt sein:
- beide Operanden haben arithmetischen Typ;
- beide Operanden sind Zeiger auf qualifizierte oder unqualifizierte Versionen kompatibler Typen;
- ein Operand ist ein Zeiger auf einen Objekt oder unvollständigen Typ und der andere ist ein Zeiger auf eine qualifizierte oder unqualifizierte Version von void; oder
- ein Operand ist ein Zeiger und der andere ist eine null pointer-Konstante.
§6.3.2.2 verbietet bereits die Verwendung von void
, und die Einschränkungen in §6.5.9 würden ebenfalls verletzt werden.
Wenn ein Compiler ptr != (void)(NULL)
zulassen würde, würde er gegen den C99-Standard verstoßen. Es könnte einfach ein Fehler oder ein Fehlverhalten einer älteren GCC-Version sein.
Ich habe nur einen Entwurf für C89 gefunden, und hier ist die void
-Sektion fast identisch mit der in C99. Aber die Sektion über die Gleichheitsoperatoren lässt mich ratlos zurück. Es scheint, als ob der Vergleich mit void
erlaubt ist, aber dies könnte ein Fehler im Entwurf oder ein Problem mit der Formulierung sein:
§3.2.2.2 void
Der (nicht existierende) Wert eines void-Ausdrucks (eines Ausdrucks, der den Typ void hat) darf in keiner Weise verwendet werden, und implizite oder explizite Umwandlungen (außer zu void) dürfen auf solch einem Ausdruck nicht angewendet werden. Wird ein Ausdruck eines anderen Typs in einem Kontext ausgewertet, in dem ein void-Ausdruck erforderlich ist, wird sein Wert oder Bezeichner verworfen. (Ein void-Ausdruck wird für seine Seiteneffekte bewertet.)
§3.3.9 Gleichheitsoperatoren
...
Einschränkungen
Es muss eine der folgenden Bedingungen erfüllt sein:
- beide Operanden haben arithmetischen Typ;
- beide Operanden sind Zeiger auf qualifizierte oder unqualifizierte Versionen kompatibler Typen;
- ein Operand ist ein Zeiger auf ein Objekt oder unvollständigen Typ und der andere ist eine qualifizierte oder unqualifizierte Version von void; oder
- ein Operand ist ein Zeiger und der andere ist eine null pointer-Konstante.