88 votes

Comment est nul * a = & a legal?

Considérez le code C ++ suivant:

 void* a = &a;
 

Pourquoi le compilateur ne se plaint-il pas d'utiliser un identifiant non déclaré?

En outre, en quoi le compilateur considère-t-il la variable a ? S'agit-il d'un pointeur sur un objet vide ou d'un pointeur sur un pointeur void* ?

95voto

Matthieu M. Points 101624

L'étendue de la déclaration de variables en C ++ peut être assez surprenante:

 void* a =               &a;
         ^~~~~~~~~~~~~~~~~
          a declared as `void*` from here on
 

Par conséquent, &a est void** mais étant donné que tout type de pointeur est convertible implicitement en void* ...

30voto

Stasik Points 1014

C'est équivalent à

 void* a;
a = &a;
 

Par conséquent, a a été déclaré. So a obtient l'adresse de a écrite en a . C'est donc un pointeur sur un pointeur vide. (Vous n'avez pas encore défini d'objets.)

7voto

Mario Rossi Points 4527

En void* a, a est déclaré comme un pointeur non pas à un void type mais de type "any" (cas particulier). Une adresse (position en mémoire) est affecté a, comme pour toute autre variable déclarée, bien sûr.

Après cela, l'expression &a est évaluée à initialiser la variable (également a, mais ce n'est pas pertinente) vient de déclarer. Le type d' &a est "pointeur de pointeur sur n'importe quel type de", qui est un cas particulier de "pointeur vers n'importe quel type d'", entièrement compatible avec le type d' a. Ergo, pas de compilateur message.

Corollaire: ne pas utiliser void* si vous voulez vérification de type fort. Quelque chose peut être transformé. Tout le contraire dans le sens inverse, sauf pour void* lui-même (il serait inutile d'exception qu'un type était incompatible avec lui-même).

Aussi, AFAIR cela vient vraiment de C.

-1voto

Nobilis Points 3511

C'est bien pour un pointeur void de pointer sur n'importe quelle adresse. Le problème est quand vous le déréférence. Vous devez lui attribuer le type auquel vous souhaitez que ce pointeur se réfère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X