Ein String-Literal ist ein Array von Zeichen * (mit statischem Speicher), das alle Zeichen im Literal zusammen mit einem Terminator enthält. Die Größe eines Arrays ist die Größe des Elements multipliziert mit der Anzahl der Elemente im Array.
Das Literal ""
ist ein Array, das aus einem char
mit dem Wert 0
besteht. Der Typ ist char[1]
und sizeof(char)
ist immer eins; Daher ist sizeof(char[1])
immer eins.
In C ist NULL
implementierungsdefiniert und oft ((void*)0)
. Die Größe von void*
, für Ihre bestimmte Implementierung ist 4. Es kann sich je nach der Plattform, auf der Sie ausgeführt werden, um eine andere Zahl handeln. NULL
kann auch auf eine Ganzzahl eines Typs mit dem Wert 0 erweitert werden, und Sie erhalten stattdessen die Größe.
* Ein Literal ist kein Zeiger, Arrays sind keine Zeiger, Zeiger spielen in diesem Teil der Frage keine Rolle.
Die leere Zeichenfolge ""
hat den Typ char[1]
oder "Array 1 von char
". Es ist nicht ein Zeiger, wie die meisten Leute glauben. Es kann zerfallen in einen Zeiger, also jedes Mal, wenn ein Zeiger auf char
erwartet wird, können Sie stattdessen ein Array von char
verwenden, und das Array wird in einen Zeiger auf sein erstes Element zerfallen.
Da sizeof(char)
1 ist (per Definition), haben wir daher sizeof("")
ist sizeof(char[1])
, was 1 * 1 = 1 ist.
In% ist NULL
eine "implementierungsdefinierte Nullzeigerkonstante" (C99 §7.17.3). Eine "Null-Zeiger-Konstante" ist definiert als ein Ganzzahl-Ausdruck mit dem Wert 0 oder ein solcher Ausdruck wird umgewandelt, um void *
(C99 §6.3.2.3.3) zu schreiben. Der tatsächliche Wert von sizeof(NULL)
ist also implementierungsdefiniert: Sie erhalten sizeof(int)
, oder Sie erhalten sizeof(void*)
. Auf 64-Bit-Systemen haben Sie oft sizeof(int) == 4
und sizeof(void*) == 8
, was bedeutet, dass Sie sich nicht darauf verlassen können, wie sizeof(NULL)
ist.
Beachten Sie auch, dass die meisten C-Implementierungen NULL
als ((void*)0)
definieren (obwohl dies vom Standard nicht benötigt wird), während die meisten C ++ - Implementierungen einfach NULL
als einfache 0
definieren. Das bedeutet, dass der Wert von sizeof(NULL)
abhängig davon, ob Code als C oder C ++ kompiliert wird (z. B. Code in Header-Dateien zwischen C- und C ++ - Quelldateien), geändert werden kann. Also nicht von sizeof(NULL)
abhängen.
"" - & gt; Cstrings werden per Konvention mit einem x'00 'Null-Zeichen abgeschlossen, so dass das Literal aus einem Zeichen x'00' besteht und 1 Byte hat.
NULL ist standardmäßig ein Null-Zeiger, der auf bestimmten 32-Bit-Rechnern eine Größe von vier Bytes hat. Auf verschiedenen Plattformen könnte er 1,2,3,4,6 oder 8 sein. Vielleicht sogar 5 oder 7, aber ich bin noch nie gekommen über eine 40-Bit- oder 56-Bit-Adressierung. Auch in einigen älteren Architekturen können zusätzliche Bits mit einem Zeiger assoziiert sein, um Daten gegenüber dem Befehl gegenüber dem Pufferspeicher des Geräts anzuzeigen.
Tags und Links c