391 Stimmen

Was ist der Unterschied zwischen NULL, ' \0 ' und 0?

In C scheint es Unterschiede zwischen verschiedenen Werten von Null zu geben -- NULL , NUL y 0 .

Ich weiß, dass das ASCII-Zeichen '0' wertet aus zu 48 o 0x30 .

Die NULL Zeiger ist in der Regel definiert als:

#define NULL 0

Ou

#define NULL (void *)0

Darüber hinaus gibt es die NUL Zeichen '\0' was anscheinend zu folgenden Ergebnissen führt 0 auch.

Gibt es Zeiten, in denen diese drei Werte nicht gleich sein können?

Gilt dies auch für 64-Bit-Systeme?

5voto

dlmeetei Punkte 8587

Ein gutes Stück, das mir beim Einstieg in C hilft (aus dem Buch Expert C Programming von Linden)

Die Eins 'l' Null und die Zwei 'l' Null

Prägen Sie sich diesen kleinen Reim ein, um sich die korrekte Terminologie für Zeiger und ASCII-Null zu merken:

The one "l" NUL ends an ASCII string,

The two "l" NULL points to no thing.

Apologies to Ogden Nash, but the three "l" nulll means check your spelling. 
  • Das ASCII-Zeichen mit dem Bitmuster Null wird als "NUL" bezeichnet.
  • Der spezielle Zeigerwert, der bedeutet, dass der Zeiger ins Leere zeigt, ist "NULL".
  • Die beiden Begriffe sind in ihrer Bedeutung nicht austauschbar.

4voto

EvilTeach Punkte 27313

Ein Ein-L-NUL, es beendet eine Zeichenkette.

Eine Zwei-L-NULL weist auf nichts hin.

Und ich wette einen goldenen Stier

Dass es keine drei L NULLL gibt.

Wie gehen Sie mit NUL um?

3voto

peterb Punkte 1330

"NUL" ist nicht 0, sondern bezieht sich auf das ASCII-Zeichen NUL. Zumindest habe ich gesehen, dass es so verwendet wird. Der Null-Zeiger wird oft als 0 definiert, aber das hängt von der Umgebung ab, in der Sie arbeiten, und von den Spezifikationen des Betriebssystems oder der Sprache, die Sie verwenden.

In ANSI C wird der Null-Zeiger mit dem Integer-Wert 0 angegeben. Jede Welt, in der das nicht der Fall ist, ist also nicht ANSI-C-konform.

3voto

richardtallent Punkte 33425

Ein Byte mit einem Wert von 0x00 ist in der ASCII-Tabelle das Sonderzeichen mit der Bezeichnung NUL o NULL . Da Sie in C keine Steuerzeichen in Ihren Quellcode einbetten sollten, wird dies in C-Strings mit einer escapeten 0 dargestellt, d.h., \0 .

Aber eine echte NULL ist pas einen Wert. Es ist die Abwesenheit eines Wertes. Bei einem Zeiger bedeutet es, dass der Zeiger nichts hat, worauf er zeigen kann. In einer Datenbank bedeutet es, dass in einem Feld kein Wert vorhanden ist (was nicht dasselbe ist wie die Aussage, dass das Feld leer, 0 oder mit Leerzeichen gefüllt ist).

Die aktuell Wert, den ein bestimmtes System oder Datenbankdateiformat verwendet, um eine NULL ist nicht unbedingt 0x00 .

1voto

John Millikin Punkte 190278

NULL ist nicht garantiert gleich 0 - der genaue Wert ist architekturabhängig. Die meisten wichtigen Architekturen definieren ihn als (void*)0 .

'\0' ist immer gleich 0, denn so ist Byte 0 in einem Zeichenliteral kodiert.

Ich weiß nicht mehr, ob C-Compiler ASCII verwenden müssen - falls nicht, '0' muss nicht immer gleich 48 sein. Unabhängig davon ist es unwahrscheinlich, dass Sie jemals auf ein System stoßen werden, das einen alternativen Zeichensatz wie EBCDIC verwendet, es sei denn, Sie arbeiten an sehr undurchsichtige Systeme.

Die Größen der verschiedenen Typen sind auf 64-Bit-Systemen unterschiedlich, aber die Ganzzahlwerte sind gleich.


Einige Kommentatoren haben Zweifel daran geäußert, dass NULL gleich 0 ist, aber nicht sein Null. Hier ist ein Beispielprogramm mit der erwarteten Ausgabe auf einem solchen System:

#include <stdio.h>

int main () {
    size_t ii;
    int *ptr = NULL;
    unsigned long *null_value = (unsigned long *)&ptr;
    if (NULL == 0) {
        printf ("NULL == 0\n"); }
    printf ("NULL = 0x");
    for (ii = 0; ii < sizeof (ptr); ii++) {
        printf ("%02X", null_value[ii]); }
    printf ("\n");
    return 0;
}

Dieses Programm kann drucken:

NULL == 0
NULL = 0x00000001

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X