Liefert Zeiger auf eine String-Konstante

8
%Vor%

"BM" muss irgendwo im schreibgeschützten Speicherbereich liegen, warum kann ich dann keinen Zeiger darauf bekommen? (Es kompiliert, aber es sagt ungültigen Speicherbereich (clang compiler))

    
Malina 16.04.2015, 11:26
quelle

2 Antworten

5

C erlaubt nicht die Adresse eines Literals:

  

Der Operand des unären & Operators muss entweder ein Funktionsbezeichner, das Ergebnis eines [] oder unary * Operators, oder ein lvalue sein, der ein Objekt bezeichnet, das kein Bitfeld ist und nicht Mit dem register Speicherklassenspezifizierer deklariert.

- C99 6.5.3.2/1

Literale gehören nicht zu den 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 zur Beschreibung von Verstößen zu erstellen. C definiert nicht das Verhalten von Code, der eine Einschränkung verletzt.

Sie können etwas erreichen, was Ihnen ähnlich erscheint:

%Vor%

Dadurch wird unter anderem das Risiko vermieden, einen Zeiger auf fehlausgerichteten Speicher zu dereferenzieren. 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.

    
John Bollinger 16.04.2015, 13:24
quelle
0

Die einfachste Lösung ist natürlich:

%Vor%

oder

%Vor%     
Paul Ogilvie 16.04.2015 15:08
quelle