stellt sich heraus, das ist nur ein weiterer Fall von "c ++ ist nicht c Blues"
Was ich will
%Vor%das einzige, was funktioniert
%Vor%Gibt es irgendwelche Compiler-Optionen oder etwas, was ich tun kann, um Strings, die nicht null sind, im gcc-Compiler zu beenden. so dass ich ein (n) konstantes Array machen kann
Keine Notwendigkeit für eine Compiler-Option, es ist bereits nicht-NUL beendet. Der Standard sagt ein NUL sollte nur hinzugefügt werden, wenn es passen kann, sonst wäre es ein Überlauf. Es kann nur sein, dass das nächste Byte im Speicher nach dem Array %code%
§ 6.7.8p14
Ein Array von Zeichen Typ kann durch ein Zeichen initialisiert werden String-Literal, optional in Klammern eingeschlossen. Aufeinander folgende Zeichen der Zeichenfolge Literal ( einschließlich der Beenden des Nullzeichens, wenn Platz vorhanden ist oder wenn das Array von ist unbekannte Größe) initialisieren die Elemente des Arrays.
Sie haben Ihre eigene Frage beantwortet. Wenn Sie dem Array explizit eine Länge geben, wie in:
%Vor% dann wird es natürlich nicht null-terminiert, weil kein Speicher für Null-Beendigung reserviert ist. ( hex[16]
liegt außerhalb der Grenzen des Objekts und daher ist Lesen oder Schreiben ein undefiniertes Verhalten. Wenn es zufällig als 0 gelesen wird, ist das UB für ya ...)
Nur wenn Sie die Länge implizit belassen, wie in:
%Vor%oder wenn Sie das Zeichenfolgenliteral als Objekt und nicht als Initialisierer verwenden, hat es eine Null-Beendigung.
Übrigens, warum interessiert es Sie, ob der Nullabschluss vorhanden ist oder nicht, wenn Sie nicht vorhaben, ihn zu verwenden. Versuchen Sie, Bytes von Ihrer Binärdatei zu rasieren? : -)
Die Zeichenfolgen werden in C null beendet. Wenn Sie ein char-Array mit nicht-null-Beendung füllen möchten, können Sie einen Array-Initialisierer verwenden.
Ich glaube, die Frage ist ein wenig unklar: In C die quoted Initialisierung:
%Vor%ist legal. In C ++ ist es nicht. Es ist also einer der Teile des Codes, die (zum Glück zur Kompilierzeit) fehlschlagen, wenn Sie von C nach C ++ wechseln.
Es wäre nett, String-Literale ohne Terminierung zu erzwingen. Etwas wie:
%Vor% wobei der \!0
am Ende dem Compiler sagt, dass er die Zeichenfolge nicht null-terminieren soll! \!
oder gar \!0
irgendwo sonst in der Zeichenfolge würde sich unmodifiziert verhalten, also einfach ein Literal !
oder !0
ausgeben.
Tags und Links string c c++ gcc null-terminated