Nicht nullterminierte String-Compiler-Option für gcc

7

Aktualisieren

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

    
GlassGhost 03.12.2010, 17:29
quelle

5 Antworten

11

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%

ist
  

§ 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.

    
SiegeX 03.12.2010, 17:32
quelle
7

Nein. NUL-terminierte Strings sind der Sprache eigen. Sie können jedoch ein Zeichen-Array haben und jedes Zeichen einzeln setzen:

%Vor%     
wallyk 03.12.2010 17:31
quelle
5

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? : -)

    
R.. 03.12.2010 17:43
quelle
0

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.

    
Laurence Gonsalves 03.12.2010 17:32
quelle
0

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.

    
Kai Petzke 16.11.2014 10:34
quelle

Tags und Links