Maison > développement back-end > C++ > L'obtention de l'adresse après la fin d'un tableau C via l'abonnement est-elle légale ?

L'obtention de l'adresse après la fin d'un tableau C via l'abonnement est-elle légale ?

Patricia Arquette
Libérer: 2024-12-20 11:07:10
original
908 Les gens l'ont consulté

Is Obtaining the Address One Past the End of a C   Array via Subscripting Legal?

Requête de la légalité de l'acquisition d'adresses de tableau un après la fin

La question

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];
Copier après la connexion

Plus précisément, &array[5] est-il conforme à la norme C ?

La réponse

Oui, le code est conforme à la norme C.

Explication

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 :

  • L'opérateur & donne l'adresse de l'opérande d'un pointeur.
  • Lorsqu'il est appliqué au résultat d'un opérateur [], l'opérateur & peut être supprimé et l'opérateur [] devient un opérateur.
  • Une expression pointant vers le dernier élément d'un tableau peut légalement pointer un passé la fin du tableau.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal