webentwicklung-frage-antwort-db.com.de

skalarobjekt erfordert ein Element in der Initialisierung

Warum, wenn ich den folgenden Vektor von uint8_t initialisieren möchte 

uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

Ich bekomme diesen Fehler

Error: scalar object 'mmac_source1' requires one element in initializer

Aber wenn ich das benutze:

uint8_t mmac_source1[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

es funktioniert gut.

9
Roxana Istrate
uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 }; 

Hier haben Sie keinen dem Zeiger zugewiesenen Speicher. mmac_source1 fungiert lediglich als Platzhalter, in dem Sie eine Adresse speichern können.

uint8_t mmac_source1[6] = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 };

Hier haben Sie ein Array, in dem sizof(uint8_t)*6 Bytes in Ihrem Compiler zugeordnet werden.

5
Ginu Jacob

In vielen Fällen ist ein Zeiger mit einem Array austauschbar. Formal kann gesagt werden, dass das erste Element eines Arrays zerlegt auf einen Zeiger.

Es gibt jedoch Ausnahmen, und die, die Sie in Ihrer Frage zitieren, 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 ist nicht sinnvoll.

3
Bathsheba

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

Wie bei Arrays lässt der Compiler den Sonderfall zu, dass der Inhalt, auf den der Zeiger mit Konstanten zeigt, zum selben Zeitpunkt initialisiert werden soll, zu dem der Zeiger deklariert wird:

char * str = "hello"; // what succeeds the equal to is the rvalue.

Die obige Aussage ist ähnlich

char str[] = "hello";

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

int* v = 2;

Ja, wir sind aber auf eigene Gefahr. Der Compiler wird anfangs mit Einem Fehler kommen:

error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]

Hier betrachtete der Compiler den rvalue als bloße Ganzzahl, bei der er erwartete, dass es sich um einen Speicherort handelt, beispielsweise & a oder so. Gleichzeitig bot Eine Option fpermissive to overrride seine Annahme, wodurch Wir den rvalue zwingen können, wie eine Speicheradresse auszusehen. fpermissive flag stuft einige Diagnosen über nichtkonforme Codes von Fehlern auf Warnungen herunter. Also beim Kompilieren habe ich es getan

g ++ - fpermissive intpointerexample.cpp -o intpointerexample

Bei der Ausführung von intpointerexample bin ich auf einen Segmentierungsfehler gestoßen, weil ich möglicherweise versucht habe, auf den Speicher zuzugreifen, für den das Programm keine Rechte hat.

1
sjsam