![Is `&array[5]` a Valid Pointer in C Beyond Array Bounds?](https://img.php.cn/upload/article/000/000/000/173595621864600.jpg)
L'abonnement aux tableaux peut-il pointer au-delà des limites du tableau ?
La question se pose de savoir si le code suivant est conforme à 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, la validité de &array[5] dans ce contexte est sous examen minutieux.
Norme C
Selon le projet de norme C99 :
-
§6.5.2.1, paragraphe 2 : "E1[E2] est identique à (*((E1) (E2)))"
-
§6.5.3.2, paragraphe 3 (souligné) : "Si l'opérande est le résultat d'un opérateur [], ni l'opérateur & ni l'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 [] avait été remplacé par un opérateur."
-
§6.5.6, paragraphe 8 : "Si l'expression P pointe un après le dernier élément d'un objet tableau, l'expression (P) 1 pointe un après le dernier élément de l'objet tableau, et si l'expression Q pointe un après le dernier élément d'un objet tableau, l'expression (Q) - 1 pointe vers le dernier élément du tableau objet."
Conclusion
Ces dispositions indiquent que :
- Les pointeurs peuvent légitimement pointer un élément au-delà de la fin d'un array (sans être déréférencé).
- &array[5] est équivalent à &*(array 5), qui à son tour est équivalent à (array 5).
- (array 5) pointe un après la fin du tableau.
- Puisque &array[5] n'entraîne pas de déréférencement, il est légal selon la norme C .
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!