Pouvez-vous prendre l'adresse d'un élément de tableau un après la fin ?
Le code suivant a fait l'objet de débats dans la programmation community :
int array[5]; int *array_begin = &array[0]; int *array_end = &array[5];
Plus précisément, la question de savoir si &array[5] est du code C légal dans ce contexte a été soulevé.
La position de la norme C
Selon la norme C, plus précisément :
Implications pour &array[5]
Application de ces règles à &array[5], nous avons :
Est-ce légal ?
Oui, c'est légal. La norme autorise explicitement les pointeurs à pointer un élément au-delà de la fin d'un tableau, à condition qu'ils ne soient pas déréférencés. Dans ce cas, &array[5] n'est utilisé que pour obtenir une adresse, pas pour accéder à la valeur à cette adresse, il se situe donc dans les limites de ce que la norme autorise.
Pourquoi la différence avec tableau 5 ou &array[4] 1 ?
Le comportement de &array[5] diffère de celui du tableau 5 ou de &array[4] 1 en raison de priorité des opérateurs et [] combinée au comportement de l'opérateur unaire * impliqué par []. Plus précisément :
En revanche, &array[5] est évalué comme si l'opérateur & avait été supprimé et que l'opérateur [] était remplacé par un opérateur, ce qui donne le tableau 5, mais sans l'évaluation de l'unaire. *opérateur.
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!