Maison >développement back-end >C++ >Est-il légal en C de prendre l'adresse d'un élément de tableau après la fin ?

Est-il légal en C de prendre l'adresse d'un élément de tableau après la fin ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-18 01:40:10468parcourir

Is it Legal in C   to Take the Address of an Array Element One Past the End?

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 :

  • §6.5.2.1 : Une désignation en indice (E1[E2]) équivaut à *((E1) (E2)).
  • §6.5.3.2 : Quand on prend l'adresse d'une expression résultant d'un opérateur [], cela équivaut à remplacer le [] par .

Implications pour &array[5]

Application de ces règles à &array[5], nous avons :

  • &array[5] est équivalent à &array[0] 5.
  • &array[0] 5 points un élément après la fin du tableau.

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 :

  • le tableau 5 est évalué comme *(tableau 5), qui tente de déréférencer un pointeur pointant au-delà de la fin du tableau, ce qui est un comportement non défini.
  • &array[4 ] 1 est évalué comme &*(array 4) 1, ce qui équivaut au tableau 5, et tente donc également de déréférencer un pointeur pointant après la fin de array.

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!

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