2012-05-24 12 views
6

Blick auf die folgende Stück Code in C++:C++: Größe eines char Array sizeof

char a1[] = {'a','b','c'}; 
char a2[] = "abc"; 
cout << sizeof(a1) << endl << sizeof(a2) << endl; 

Obwohl sizeof(char) ist 1 Byte, warum hat die Show Ausgang sizeof(a2) als 4 und nicht mehr als 3 (wie im Fall von a1)?

+0

+1 Nach den Antworten (und meiner Erfahrung mit Junior-Programmierern), ist dies eine Frage, die eine Menge Verwirrung verursacht und zu vielen kleinen Fehlern führt, die schwer zu finden sind. –

Antwort

14

C-Strings enthalten einen Nullabschluss und fügen somit ein Zeichen hinzu.

Im Grunde diese:

char a2[] = {'a','b','c','\0'}; 
+1

Ich mag diese Antwort für ihre klare Aussage über die Äquivalenz der Initialisierung, aber es macht mehr Sinn, über 'a2 'zu sprechen, nicht' a1' - die Init, die du hier zitierst, erhältst du, indem du den C-String in 'stopfst a2'. –

0

Für a2, dies ist ein String, so dass es auch die '\ n' enthält

Korrektur, nachdem Ethan & Adam Kommentar, das ist nicht '\ n' von natürlich, aber Null-Terminator, der '\ 0' ist

+1

Es gibt kein '\ n' (Zeilenvorschub) am Ende von' a2'. Am Ende einer Zeichenfolge befindet sich ein Nullzeichen ('\ 0'). Schande über dich, Upvoter. –

+0

-1: Falsch, 'a2' enthält am Ende kein '' \ n'', sondern '' \ 0''. –

+0

Entschuldigung, Sie haben Recht, ich meinte den Null-Terminator '\ 0' danke für die Korrektur – miks

1

Das ist, weil gibt es eine zusätzliche Null '\0' Zeichen an das Ende der C-Zeichenfolge hinzugefügt, während die erste Variable, a1 ist ein Array von drei separaten Zeichen.

sizeof wird Ihnen die Bytegröße einer Variablen mitteilen, aber bevorzugen strlen, wenn Sie die Länge einer C-Zeichenfolge zur Laufzeit möchten.