c++ - pointeurs - pointeur sur fonction c




déréférencement du pointeur null (3)

int* p = 0;
int* q = &*p;

Est-ce que ce comportement n'est pas défini ou pas? J'ai parcouru certaines questions connexes, mais cet aspect spécifique ne s'est pas manifesté.


IMHO, En ce qui concerne les deux lignes de code, il n'y a pas d'accès en dehors de l'espace d'adressage. La deuxième instruction prend simplement l'adresse de (* p) qui serait de nouveau "p" et par conséquent, elle stockera "0". Mais l'emplacement n'est jamais accessible .


La réponse à cette question est la suivante: cela dépend de la langue que vous suivez :-).

En C90 et C ++, cela n'est pas valide car vous effectuez une indirection sur le pointeur null (en effectuant *p ), ce qui entraîne un comportement indéfini.

Cependant, en C99, ceci est valide, bien formé et bien défini. En C99, si l'opérande de l'unary- & été obtenu à la suite de l'application de l'unary- * ou en effectuant un index ( [] ), alors ni le & ni le * ou [] n'est appliqué. Par exemple:

int* p = 0;
int* q = &*p; // In C99, this is equivalent to int* q = p;

Également,

int* p = 0;
int* q = &p[0]; // In C99, this is equivalent to int* q = p + 0;

De C99 §6.5.3.2 / 3:

Si l'opérande [de l'unaire & opérateur] est le résultat d'un opérateur unaire * , ni cet opérateur ni l'opérateur & sont évalués et le résultat est comme si les deux étaient omis, sauf que les contraintes sur les opérateurs s'appliquent toujours et le résultat n'est pas une lvalue.

De même, si l'opérande est le résultat d'un opérateur [] , ni l'opérateur & ni l'unaire * qui est impliqué par [] sont évalués et le résultat est comme si l'opérateur & avait été supprimé et l'opérateur [] un opérateur +

(et sa note de bas de page, n ° 84):

Ainsi, &*E est équivalent à E (même si E est un pointeur nul)


Oui, le fait de déréférencer le pointeur nul est un comportement indéfini. La constante entière 0 dans un contexte de pointeur est le pointeur nul. C'est tout.

Maintenant, si votre deuxième ligne était int *q = p; ce serait une simple affectation de pointeur. Si le compilateur supprime le &* et réduit le déréférencement à une affectation, vous êtes OK.





pointers