Pouvez-vous déréférencer un pointeur NULL pour acquérir une référence ?
La norme C définit le déréférencement d'un pointeur NULL comme un comportement indéfini. Cependant, les extraits de code impliquant le déréférencement d'un pointeur NULL pour obtenir une référence, tels que les suivants, soulèvent des questions :
int* ptr = NULL; int& ref = *ptr; int* ptr2 = &ref;
Définition standard :
Selon la norme C (8.3.2/4 "Références"), une référence nulle ne peut pas exister dans un programme bien défini. En effet, la création d'une telle référence nécessiterait de la lier à « l'objet » obtenu en déréférençant un pointeur nul, ce qui constitue un comportement indéfini.
Détail d'implémentation ou bien défini ?
En pratique, l'extrait de code fourni entraîne la définition de ptr2 sur NULL. Cependant, il ne s’agit là que d’un détail d’implémentation. La norme indique explicitement que le déréférencement d'un pointeur nul n'est pas défini.
Impact du déréférencement d'un pointeur NULL :
En général, le déréférencement d'un pointeur nul entraîne un crash. Dans le cas spécifique de son utilisation pour obtenir une référence, le compilateur implémente la référence comme un pointeur, éliminant ainsi l'opération de déréférencement proprement dite. Néanmoins, le comportement sous-jacent non défini demeure.
Exception : l'opérateur sizeof
L'exception au déréférencement d'un pointeur nul d'une manière bien définie est l'opérateur sizeof. Lors de l'utilisation de sizeof, l'opérande n'est pas évalué, évitant ainsi l'opération de déréférencement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!