Skalarobjekt benötigt ein Element im Initialisierer

8

Warum, wenn ich den folgenden Vektor von uint8_t

initialisieren möchte %Vor%

Ich bekomme diesen Fehler

%Vor%

Aber wenn ich das benutze:

%Vor%

es funktioniert gut.

    
Roxana Istrate 23.07.2014, 08:19
quelle

3 Antworten

3
%Vor%

Hier wird dem Zeiger kein Speicher zugewiesen. mmac_source1 fungiert nur als Platzhalter, in dem Sie eine Adresse speichern können.

%Vor%

Hier haben Sie ein Array, in dem Sie in Ihrem Compiler sizof(uint8_t)*6 bytes zuweisen.

    
Ginu Jacob 23.07.2014, 08:34
quelle
2

In vielen Fällen ist ein Zeiger mit einem Array austauschbar. Formaler kann gesagt werden, dass das erste Element eines Arrays zu einem Zeiger zerfällt.

Aber es gibt Ausnahmen und die, die Sie in Ihrer Frage anführen, ist eine davon: uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 }; ist nicht syntaktisch gültig. Konzeptionell ordnen Sie in Ihrem zweiten Fall das Array auf dem Stapel zu. Die Verwendung eines Zeigers in dieser Instanz macht keinen Sinn.

    
Bathsheba 23.07.2014 08:24
quelle
0

Der für eine Zeigerinitialisierung erwartete rvalue ist eine Speicheradresse.

Wie im Fall von Arrays erlaubt der Compiler den Sonderfall, dass wir den Inhalt, auf den der Zeiger mit Konstanten zeigt, im selben Moment initialisieren wollen, in dem der Zeiger deklariert wird:

%Vor%

Die obige Anweisung ähnelt

%Vor%

Die nächste Frage ist, ob wir folgendes tun dürfen:

%Vor%

Ja, wir sind aber auf unser eigenes Risiko. Der Compiler wird zuerst mit kommen ein Fehler:

%Vor%

Hier betrachtete der Compiler den rvalue als eine ganze Zahl, wobei das, was er erwartete, eine Speicherstelle war, zum Beispiel & amp; a oder so. Gleichzeitig es bot eine Option fpermissive zu überschreiben seine Annahme, wodurch wir können den rvalue zwingen, wie eine Speicheradresse auszusehen. fpermissive -Flag stuft einige Diagnosen über nicht-konformen Code von Fehlern auf Warnungen herunter. Also beim Kompilieren habe ich

gemacht

g ++ -permissives intpointerexample.cpp -o intpointerexample

Bei der Ausführung von intpointerexample kam es schließlich zu einem Segmentierungsfehler, da ich möglicherweise versucht habe, auf Speicher zuzugreifen, auf den das Programm keine Rechte hat.

    
sjsam 28.01.2015 02:52
quelle

Tags und Links