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
Susan Sarandonoriginal
2024-12-26 07:18:45427parcourir

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];

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)

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!

Déclaration:
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