2013-07-30 5 views
31

Zum Beispiel:Haben String-Literale, die mit einem Null-Terminator enden, einen zusätzlichen Null-Terminator?

char a[] = "abc\0"; 

Does Standard C sagen, dass ein anderer Byte Wertes 0 muss auch angehängt werden, wenn die Zeichenfolge bereits eine Null am Ende hat? Also, ist sizeof(a) gleich 4 oder 5?

+1

Es ist absolut nichts falsch mit dem Englisch in Ihrer Frage. Aber konnten Sie die Antwort nicht einfach finden, indem Sie es versuchen? – Barmar

+2

Wenn Sie explizit sein möchten, könnten Sie schreiben: 'char a [] = {'a', 'b', 'c', '\ 0'};'. Dies wird nicht als Zeichenfolgenliteral deklariert, sodass ein zusätzlicher abschließender Nullwert nicht angehängt wird. –

+0

Alternativ könnten Sie 'char a [4] =" abc \ 0 ";' schreiben. – nwellnhof

Antwort

50

Alle String-Literale haben einen impliziten Null-Terminator, unabhängig vom Inhalt der Zeichenkette.

der Standard (6.4.5 String Literale) sagt:

Ein Byte oder Code Wert Null zu jeder Mehrbyte-Zeichenfolge angehängt wird, die von einem String-Literal oder Literale führt.

So enthält das Zeichenfolgenliteral "abc\0" den impliziten Null-Terminator zusätzlich zu dem expliziten. So enthält das Array a 5 Elemente.

+0

'Also, das Array a enthält 5 Elemente.' Meinst du '4' Elemente? –

+10

@BikalGurung: Nein, 5 ist richtig. {'a', 'b', 'c', '\ 0', '\ 0'} –

Verwandte Themen