Zum Beispiel:
char a[] = "abc\0";
Sagt Standard-C, dass ein weiteres Byte Wert ist 0
muss angehängt werden, auch wenn der String am Ende bereits eine Null hat? Also ist sizeof(a)
gleich 4 oder 5?
xiaokaoy
Zum Beispiel:
char a[] = "abc\0";
Sagt Standard-C, dass ein weiteres Byte Wert ist 0
muss angehängt werden, auch wenn der String am Ende bereits eine Null hat? Also ist sizeof(a)
gleich 4 oder 5?
David Heffernan
Alle String-Literale haben ein implizites Null-Terminator, unabhängig vom Inhalt des Strings.
Der Standard (6.4.5 String Literals) sagt:
Ein Byte oder Code mit dem Wert Null wird an jede Mehrbyte-Zeichenfolge angehängt, die sich aus einem oder mehreren Zeichenfolgenliteralen ergibt.
Also das String-Literal "abc\0"
enthält zusätzlich zum expliziten den impliziten Nullterminator. Also das Array a
enthält 5 Elemente.
‘Das Array a enthält also 5 Elemente.’ Meinst du 4
Elemente?
– Bikal Lem
29. Februar 2016 um 2:03 Uhr
@BikalGurung: Nein, 5 ist richtig. {‘a’, ‘b’, ‘c’, ‘\0’, ‘\0’}
– Dietrich Ep
29. Februar 2016 um 2:11 Uhr
Es gibt eine Ausnahme zum impliziten Null-Terminator in C, z char s[3] = "abc";
hier, s
wird kein Null-Terminator haben. (Übrigens wird dies ein Kompilierfehler in C++ sein). Siehe diese Antwort.
– Johann
23. Januar um 23:33 Uhr
An den Engländern in Ihrer Frage ist absolut nichts auszusetzen. Aber konntest du die Antwort nicht finden, indem du es einfach ausprobierst?
– Barmar
30. Juli 2013 um 9:41 Uhr
Wenn du explizit sein willst, könntest du schreiben:
char a[] = {'a','b','c','\0'};
. Dies wird nicht als Zeichenfolgenliteral deklariert, sodass keine zusätzliche abschließende Null angehängt wird.– Coder_Dan
30. Juli 2013 um 10:10 Uhr
Alternativ könntest du auch schreiben
char a[4] = "abc\0";
.– nwellnhof
23. Dezember 2016 um 11:22 Uhr
Letzteres mag etwas falsch erscheinen, da der Standard besagt, dass ein zusätzliches ‘\0’ angehängt wird, wodurch die Zeichenfolge literal 5 Zeichen groß wird und somit scheinbar zu groß für ein 4-Zeichen-Array ist. Falls jedoch ein Initialisierer zu groß für ein Array mit fester Größe ist, werden die überzähligen Elemente einfach ignoriert/nicht für die Initialisierung verwendet (§6.7.8 Absatz 14), was in diesem Fall in Ordnung ist, aber ich würde es vermeiden, es so zu schreiben.
– stefankt
4. Februar 2018 um 18:47 Uhr