Warum, wenn ich den folgenden Vektor von uint8_t
Ich bekomme diesen Fehler
%Vor%Aber wenn ich das benutze:
%Vor%es funktioniert gut.
Hier wird dem Zeiger kein Speicher zugewiesen.
mmac_source1
fungiert nur als Platzhalter, in dem Sie eine Adresse speichern können.
Hier haben Sie ein Array, in dem Sie in Ihrem Compiler sizof(uint8_t)*6
bytes zuweisen.
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.
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
gemachtg ++ -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.