"BM"
muss irgendwo im schreibgeschützten Speicherbereich liegen, warum kann ich dann keinen Zeiger darauf bekommen? (Es kompiliert, aber es sagt ungültigen Speicherbereich (Klirren Compiler))Zeiger auf eine String-Konstante erhalten
Antwort
C ermöglicht nicht die Adresse einer wörtlichen unter:
Der Operand des unären
&
Luftfahrtunternehmer entweder eine Funktion Bezeichner sein, die Ergebnis eines[]
oder unary*
Operators oder eines Lvalue, der ein Objekt bezeichnet, das kein Bitfeld ist und nicht mit dem Speicherklassenspezifiziererregister
deklariert ist.
- C99 6.5.3.2/1
Literale fallen nicht in eine der zulässigen Kategorien von Operanden. Dies ist eine formale Einschränkung der sprachkonformen Implementierungen, die keinen Code akzeptieren müssen, der sie verletzt, und sind erforderlich, um Diagnosen zu erstellen, die Verletzungen beschreiben. C definiert nicht das Verhalten von Code, der eine Einschränkung verletzt.
Sie können etwas ähnliches erreichen, was Sie scheinen, wie so zu wollen:
union short_str {
char str[3];
int16_t sh;
} u = { "BM" };
short var = u.sh;
unter anderem dies vermeidet das Risiko, einen Zeiger auf falsch ausgerichteten Speicher dereferencing. C richtet den Speicher für die Variable u
so aus, dass alle Elemente an einer geeigneten Grenze ausgerichtet sind. Dies vermeidet eine mögliche Fallstricke mit jeder Annäherung entlang der Linien, die Sie ursprünglich versuchten.
Ist diese Initialisierung in C89 legal? Es sieht für mich wie eine Innovation aus. – Malina
@ KlasLindbäck Dies ist das einzige nicht tragbare aber schnell genug. Das andere ist explizites Casting (was die Lösung versucht). Aber durch das Entfernen der '&' - funktioniert es, solange es einem Char zugewiesen ist. – Malina
i.e 'short var = * ((const short *)" BM ");' gibt eine Warnung aus. Und AFAIK .. Warnungen sollten in den meisten Fällen als Fehler interpretiert werden. – Malina
Die einfachste Lösung ist natürlich:
short var= 0x424D; // memory reads 4D, 42 = 'M', 'B'
oder
short var= 0x4D42; // memory reads 42, 4D = 'B', 'M'
'char var = * ((const char *) &"BM");' kompiliert auf MSVC2012 Ich denke, * * das ist gut. Ich denke, das Verhalten Ihres Beispiels ist undefiniert. – Bathsheba
Es gibt 'Lesefehler in ungültigem Speicherbereich 'zurück, was bedeutet, dass es versucht, auf Speicheradresse zuzugreifen, die nicht vorhanden oder schreibgeschützt ist. Überrascht funktioniert es auf MSVC2012 – Malina
' int main() {char var = * ((const char *) &"BM"); \t printf ("% c", var);} 'kompiliert und läuft auf gcc 4.7.3 – Bathsheba