2013-03-18 8 views
10

Lesen Sie einfach Zeiger auf C-Buch von Kenneth Reek. Es besagt, dass ein NUL-Byte eins ist, dessen Bits alle 0 sind, geschrieben wie folgt '\0' und NULL hat einen Wert 0, der sich auf einen Zeiger bezieht, dessen Wert Null ist.Sind NUL und NULL in C austauschbar?

Beide sind Ganzzahlen und haben den gleichen Wert, so dass sie austauschbar verwendet werden können.

und dieser Code auch:

char const *keyword[] = { "do", "for", "if", "register", 
           "return", "switch", "while", NULL }; 

In diesem Code lässt die NULL-Funktionen, die in der Tabelle erkennt das Ende der Tabelle suchen. Können wir also NULL- und NUL-Makros austauschen?

+0

Haben Sie es versucht? In der Regel verwenden Sie ''\ 0'' für Zeichen in Strings und' NULL' oder 'nullptr' für Zeiger. – antonijn

+3

* damit sie austauschbar verwendet werden können * schrecklicher Rat. – cnicutar

Antwort

15

NUL ist die Schreibweise für einen ASCII-Zeichencode 0.

NULL ein Makro in stddef für den Null-Zeiger definiert ist.

So, keine, sie sind nicht austauschbar zu verwenden.

+1

NULL hat die Größe eines Zeigers (normalerweise 32 oder sogar 64 Bits). NUL hat die Größe eines Zeichens (normalerweise 8 Bits in C und manchmal 16 in anderen Sprachen, die 16-Bit-Unicode unterstützen). Sie können nicht synonym verwendet werden. Wenn Sie eine 0 in einer Zeichenfolge verwenden, ist dies NUL. Wenn Sie eine 0 in einem Zeiger verwenden, ist es NULL. Nur NULL hat ein Makro in C. In C erhalten alle Literal-Strings ein NUL 0 Byte, das am Ende automatisch vom Compiler angehängt wird, so dass kein Makro benötigt wird. – nonrectangular

+0

@nonrectangular "NULL hat die Größe eines Zeigers" -> vielleicht. Es könnte die Größe eines 'int' haben. Der _type_ von 'NULL' ist nicht angegeben. – chux

12

Es gibt keine standardisierten NUL Makro, zumindest nicht in C.

Auch NULL den Vorteil gegenüber einem einfachen 0 wörtlichen hat, dass es den Leser signalisiert, dass „Hey, wir sind mit einem Zeiger zu tun“ das könnte als ein Vorteil angesehen werden.

In C++ war das Idiom für eine lange Zeit nur 0 zu schreiben, aber dann scheinen sie das umgekehrt zu haben und führten aus irgendeinem Grund ein neues Literal nullptr ein.

In C empfehle ich schreiben NULL für Zeiger und '\0' für Zeichen.

+2

Noch stärker, vermeiden Sie die Verwendung von 'NULL' für Zeichen, denn wenn Ihr Code jemals C++ 11 wird, gibt Ihnen das Suchen und Ersetzen von' NULL' mit 'nullptr' zusätzliche Sicherheit. Und jede Verwendung von "NULL" für die Ganzzahlkonstante Null, die kein Zeiger ist, macht dies schwieriger. – Yakk

+0

Der Grund für nullptr ist, dass es ein void * -Zeiger ist. NULL in C ist nicht. Also ist der 'Grund' für Typensicherheit – pm100

Verwandte Themen