Maison > développement back-end > C++ > Prendre l'adresse un après la fin d'un tableau C est-il légal ?

Prendre l'adresse un après la fin d'un tableau C est-il légal ?

Susan Sarandon
Libérer: 2024-12-26 07:18:45
original
399 Les gens l'ont consulté

Is Taking the Address One Past the End of a C   Array Legal?

Le fait de prendre l'adresse d'un élément de tableau un après la fin est-il autorisé par la norme C ?

L'extrait de code ci-dessous a suscité des discussions sur sa validité selon la norme C :

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 une expression C légale dans ce contexte ?

Légalité selon la norme C

La norme C définit la légalité de cette expression :

  • Norme C 17 6.5.2.1, paragraphe 2 : Définit E1[E2] comme identique à (*((E1) (E2))).
  • Norme C 17 6.5.3.2, paragraphe 3 : Indique que pour une expression [], l'opérateur & et le * implicite ne sont pas évalués, ce qui entraîne & (E1 E2).
  • C 17 Norme 6.5.6, paragraphe 8 : Autorise les pointeurs pour pointer un élément au-delà de la fin d'un tableau, mais interdit de les déréférencer.

Interprétation

En appliquant ces règles à &array[5], nous avons :

&array[5] = &*(array + 5) = (array + 5)
Copier après la connexion

Puisque (tableau 5) pointe après la fin du tableau et n'est pas déréférencé, c'est une expression légale selon le Standard C.

Comparaison avec le Standard C

Ce comportement est également conforme au Standard C, qui permet de prendre l'adresse des éléments au-delà de la fin d'un tableau, encore une fois à condition qu'ils ne soient pas déréférencés.

Raison de la différence Traitement

La décision de traiter différemment le tableau 5 et le &array[4] 1 est enracinée dans les objectifs différents de ces expressions :

  • le tableau 5 fournit un pointeur situé au-delà du fin du tableau, permettant des comparaisons et des déplacements au-delà des limites du tableau.
  • &array[4] 1 tentative de création d'une référence à un élément inexistant, ce qui entraînerait un comportement indéfini.

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