Es gibt keine Anforderung, const
zu verwenden, aber es ist eine gute Idee.
In C wird ein Stringliteral ist ein Ausdruck des Typs char[N]
, wo N
die Länge der Zeichenkette plus 1 (für die Beendigung '\0'
Null-Zeichen). Der Versuch, das Array zu ändern, das dem Zeichenfolgenliteral entspricht, hat jedoch ein nicht definiertes Verhalten. Viele Compiler sorgen dafür, dass dieses Array im Nur-Lese-Speicher gespeichert wird (kein physisches ROM, sondern Speicher, der vom Betriebssystem als schreibgeschützt markiert ist). (Ein Array-Ausdruck wird in den meisten Kontexten in einen Zeiger-Ausdruck umgewandelt, der sich auf das Anfangselement des Array-Objekts bezieht.)
Es wäre sinnvoller gewesen, Zeichenfolgenliterale const
zu erstellen, aber das Schlüsselwort const
existierte nicht in alten Versionen von C, und es hätte bestehenden Code gebrochen. (C++ hat String-Literale gemacht const
).
Dies:
char *s= "example"; /* not recommended */
ist in C tatsächlich vollkommen gültig, aber es ist potenziell gefährlich. Wenn Sie nach dieser Deklaration Folgendes tun:
s[0] = 'E';
dann versuchen Sie, das Zeichenfolgenliteral zu ändern, und das Verhalten ist nicht definiert.
Dies:
const char *s= "example"; /* recommended */
ist auch gültig; Der Wert char*
, der aus der Auswertung des Zeichenfolgenliterals resultiert, wird sicher und leise in const char*
konvertiert. Und es ist im Allgemeinen besser als die erste Version, weil es Sie vom Compiler warnen lässt, wenn Sie versuchen, das String-Literal zu ändern (es ist besser, Fehler während der Kompilierung als zur Laufzeit zu finden).
Wenn Sie bei Ihrem ersten Beispiel einen Fehler erhalten, ist es wahrscheinlich, dass Sie versehentlich Ihren Code als C++ anstatt als C kompilieren - oder dass Sie die Option -Wwrite-strings
von gcc oder etwas ähnliches verwenden. (-Wwrite-strings
macht Stringliterale const
;. Es die Sicherheit verbessern kann, aber es kann auch gcc verursachen abzulehnen oder zumindest zu warnen, gültig C-Code)
Weil Sie String-Literale nicht ändern können. –
das erklärt nicht, warum es nicht geändert werden kann. Da char * s = "Beispiel" sollte nur ein Array von Zeichen geben. Ich verstehe, dass Sie nicht sollten, aber es erklärt nicht, warum Sie nicht können. –
Ich glaube nicht, dass Sie einen Fehler mit dem ersten bekommen, es ist gültig. – krato