Wie kann ich überprüfen, ob ein Zeiger NULL ist?
Der Titel mag ein wenig irreführend... nur weil ich mir nicht sicher, ob mein char Zeiger zeigt auf NULL, oder wenn es nur ein Hinweis auf ein char-array der Größe 0.
Also ich habe
char* data = getenv("QUERY_STRING");
Und ich möchte, um zu überprüfen, ob Daten null ist (oder ist Länge < 1). Ich habe versucht:
if(strlen(data)<1)
aber ich bekomme eine Fehlermeldung:
==24945== Invalid read of size 1
==24945== at 0x8048BF9: main (in /cpp.cgi)
==24945== Address 0x1 is not stack'd, malloc'd or (recently) free'd
Ich habe auch versucht
if(data == NULL)
aber mit dem gleichen Ergebnis.
Was ist denn hier Los? Ich habe bereits versucht cout mit den Daten, und das funktioniert auch. Ich kann einfach nicht scheinen, um zu überprüfen, ob es null oder leer ist.
Merke ich, das sind zwei verschiedene Dinge (null und leere). Ich möchte wissen, welche Daten dabei wäre, und wie Sie überprüfen, wenn es ist null/leer ist.
const char*
, nicht char*
. Aus (C++) docs: The string pointed by the pointer returned by this function shall not be modified by the program.
InformationsquelleAutor varatis | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit getenv, müssen Sie behandeln beide Fälle! (Yay!) Wenn die Umgebungsvariable nicht gesetzt, dann gibt die Funktion NULL zurück. Wenn es gesetzt ist, dann erhalten Sie einen Zeiger auf den Wert gesetzt, der kann auch leer sein. Also:
Natürlich müssen Sie überprüfen, ob es NULL vor versuchen, um zu bestimmen, dessen Länge oder gelesen Zeichen Punkte: -- dies ist der Grund, warum die beiden Bedingungen in den oben genannten
if
geordnet sind, wie Sie sind.if (data && *data) { ... }
Ja, ja, es könnte. Aber welches ist besser lesbar? Das ist eine Frage der Stellungnahme. Verwenden Sie, was Ihnen am besten gefällt! Meine persönliche Präferenz wäre
if (data && data[0] != '\0')
. Ich fügte hinzu, die!= NULL
zu machen, meine Antwort klarer.Einige Leute, die auf SO die Behauptung, dass es Plattformen, auf denen NULL != 0. Auf der anderen Seite "Ein Wert null ist, wird null-Zeiger-Wert oder null-Element Zeiger Wert in false umgewandelt;". Was bedeutet, dass beide Arten der Prüfung gültig sind.
InformationsquelleAutor Cameron
In der Regel würde Sie überprüfen, wie so etwas wie dieses. Der erste Teil überprüft die Zeiger für die null, die zweite sucht nach einem leeren string prüfen der ersten Zeichen für die null-Abschlusszeichen am Ende jeder Zeichenkette.
Dein problem sieht aus wie einige spezifische Interaktion zwischen
getenv
undstrlen
das ist nicht standard.getenv
gibt einen Zeiger auf ein normales null-terminierten C-string.strlen
ist gebaut für diese Art von strings.Können Sie sich vorstellen, null-Länge C-string beginnt nicht mit
\0
?Nein. Können Sie?
Ich denke
!data[0]
werden kürzer.Dann gibt es keinen Grund für die Verwendung von strlen.
InformationsquelleAutor Mark Ransom