Forum: Compiler & IDEs Fehler bei char[]="\x01Auto"


von Hermann G. (hahgeh)


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

von Benedikt K. (benedikt)


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

von Hermann G. (hahgeh)


Lesenswert?

Ah wunderbar, das werde ich morgen gleich mal ausprobieren.

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.