Enthalten Zeichenfolgenliterale, die mit einem Nullterminator enden, einen zusätzlichen Nullterminator?

Lesezeit: 2 Minuten

Benutzeravatar von xiaokaoy
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?

  • 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

Benutzeravatar von David Heffernan
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


1408870cookie-checkEnthalten Zeichenfolgenliterale, die mit einem Nullterminator enden, einen zusätzlichen Nullterminator?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy