web-dev-qa-db-fra.com

objet scalaire nécessite un élément dans l'initialiseur

Pourquoi quand je veux initialiser le vecteur suivant de uint8_t 

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

Je reçois cette erreur

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

Mais quand j'utilise ceci:

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

ça fonctionne bien.

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

Ici, la mémoire allouée au pointeur n'est pas allumée. mmac_source1 agit simplement comme un espace réservé dans lequel vous pouvez stocker une adresse.

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

Ici vous avez un tableau où dans votre compilateur alloue sizof(uint8_t)*6 octets.

5
Ginu Jacob

Dans de nombreux cas, un pointeur est interchangeable avec un tableau. Plus formellement, on peut dire que le premier élément d'un tableau décompose en un pointeur.

Toutefois, il existe des exceptions et celle que vous citez dans votre question est l'une d'entre elles: uint8_t *mmac_source1 = { 0x01, 0x80, 0xc2, 0x00, 0x00, 0x01 }; n'est pas valide du point de vue de la synthèse. Conceptuellement, vous allouez, dans votre deuxième cas, le tableau sur la pile. L'utilisation d'un pointeur dans cette instance n'a pas de sens.

3
Bathsheba

La valeur attendue pour une initialisation de pointeur est une adresse mémoire.

Comme dans le cas des tableaux, le compilateur autorise le cas particulier dans lequel on souhaite initialiser le contenu pour lequel le pointeur pointe avec des constantes au même moment où le pointeur est déclaré:

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

La déclaration ci-dessus est similaire à

char str[] = "hello";

La prochaine question est si nous sommes autorisés à faire ce qui suit:

int* v = 2;

Oui, nous le sommes, mais à nos risques et périls. Le compilateur aura initialement une erreur :

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

Dans ce cas, le compilateur a considéré la valeur rvalue comme un simple entier, où il s’attendait par exemple à un emplacement de mémoire & a ou environ. Dans le même temps , Il offrait une option fpermissive to override son hypothèse selon laquelle Peut forcer la valeur rvalue à ressembler à une adresse mémoire. fpermissive flag rétrograde certains diagnostics sur le code non conforme de erreurs en avertissements . Donc, lors de la compilation, j'ai

g ++ -fpermissive intpointerexample.cpp -o intpointerexample

Finalement, lors de l’exécution d’intpointerexample, j’ai rencontré une erreur de segmentation car j’ai peut-être tenté d’accéder à la mémoire pour laquelle le programme n’a pas les droits.

1
sjsam