Fehler bei char[]="\x01Auto"

OP #1025935
Lesenswert?

Hallo,

Man kann doch in einem character array in C im Initialisierungs-String 
Zeichen als hexadezimalen Wert angeben, so wie im Betreff. Also mit 
\xhh, vobei hh die Hexadezimalziffern sind.

Nach meinem Wissen sollte der Compiler aus:
1
const char []="\x01Auto";
folgende Bytefolge im Speicher machen (hex):
01 41 75 74 6F 00

Bei mir tut er es aber nicht. Bei mir interpretiert er immer das 'A', 
welches auch eine hex-Ziffer sein könnte, als solche und macht aus \x01A 
0x1A
also:
1A 75 74 6F 00

Wie kann ich das verhinder, bzw. wieso ist das überhaupt so, denn ein 
char-Zeichen kann ja nur aus maximal zwei hex-Ziffern bestehen.

Ich verwende den arm-gcc. Die Version weiß ich gerade nicht, da muss ich 
morgen nochmal nachschauen.

VDumfG
hahgeh
#1025937
Lesenswert?

Man kann Strings unterteilen, dadurch kann man das Interpretieren als 
Hex beenden:
const char []="\x01""Auto";
Die beiden Strings "\x01" und "Auto" werden automatisch zusammengefügt.

Ich bin auch schon auf dieses Problem reingefallen, das je nach Text nur 
selten auftritt (nämlich wenn der auf den Hex Wert folgenden Buchstaben 
ein A-F ist).
Moderator Persönliche Seite #1025957
Lesenswert?

Hermann Günther wrote:

> Aber das ist schon irgendwie seltsam. Gibt es für dieses Verhalten einen
> bestimmten Grund, oder ist das "nur" ein Compilerfehler?

Es ist ein Fehler in deinem Code.  Der Compiler tut genau das, was ihm
der C-Standard aufträgt.  Oktale Escape-Folgen werden nach dem dritten
Zeichen oder beim ersten nicht-oktalen Zeichen beendet, je nachdem,
welche der beiden Bedingungen zuerst eintritt.  Hexadezimale Folgen
werden ausschließlich mit dem ersten nicht-hexadezimalen Zeichen
beendet.  Auf diese Weise lassen sich Bytes mit beliebig vielen Bits
abbilden.

Meines Wissens ist eigens dafür in C89 (also vor ca. 20 Jahren) die
Möglichkeit eingeführt worden, dass zwei aufeinanderfolgend
geschriebene Zeichenkettenkonstanten vom Compiler zu einer einzigen
zusammengefügt werden.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren