warum sizeof ("") entspricht 1 und sizeof (NULL) entspricht 4 in c-Sprache?

9

warum sizeof("") entspricht 1 und sizeof(NULL) entspricht 4 in C-Sprache?

    
Jagan 10.11.2010, 06:02
quelle

5 Antworten

18

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.

    
GManNickG 10.11.2010, 06:12
quelle
12

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.

    
Adam Rosenfield 10.11.2010 06:17
quelle
5

NULL in C ist definiert als (void *) 0. Da es ein Zeiger ist, dauert es 4 Bytes, um es zu speichern. Und "" ist 1 Byte, weil diese "leere" Zeichenfolge ein EOL-Zeichen ('\ 0') hat.

    
swatkat 10.11.2010 06:07
quelle
2

sizeof (NULL) ist nicht nichts, sondern ein Zeiger auf die Adresse 0, und ein Zeiger auf einem 32-Bit-System benötigt 4 Bytes.

    
Espen 10.11.2010 06:07
quelle
0

"" - & 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.

    
James Anderson 10.11.2010 06:14
quelle

Tags und Links