En C, l'adresse d'un élément de tableau peut-elle un après sa fin peut-il être obtenu par abonnement, comme indiqué dans l'extrait de code suivant ?
int array[5]; int *array_begin = &array[0]; int *array_end = &array[5];
Plus précisément, &array[5] est-il conforme à la norme C ?
Oui, le code est conforme à la norme C.
Selon au projet de norme C99 :
§6.5.2.1, paragraphe 2 :
Une expression postfixée suivie d'une expression entre crochets [] est une désignation en indice d'un élément d'un objet tableau.
§6.5.3.2, paragraphe 3 :
Si l'opérande [de l'opérateur &] est le résultat d'un opérateur [], ni l'opérateur & ni l'opérateur unaire * qui est impliqué par le [] est évalué et le résultat est comme si l'opérateur & avait été supprimé et que l'opérateur [] était remplacé par un opérateur.
§6.5.6, paragraphe 8 :
Si l'expression P pointe vers le dernier élément d'un objet tableau, l'expression (P) 1 pointe un après le dernier élément du tableau objet.
Basé sur ces extraits :
Par conséquent, l'expression &array[5] est équivalente à *(array 5), qui pointe au-delà du dernier élément du tableau. Ceci est légal selon la norme, tant que le pointeur n'est pas déréférencé.
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!