Le sujet "un pointeur est autorisé à pointer vers n'importe quel élément d'un tableau" fait partie du langage C depuis très longtemps ; on le trouve déjà dans le fichier Norme ANSI-C / C89 (cf. section 6.3.6 Opérateurs additifs, page 46f), qui mentionne déjà que dans cette plage, les implémentations doivent empêcher les débordements arithmétiques. Dans cette section, à la fin de la page 47, on peut également trouver une note de bas de page qui explique le raisonnement qui se cache derrière :
Une autre façon d'aborder l'arithmétique des pointeurs consiste à convertir d'abord l'élément pointeur(s) en pointeurs de caractères : Dans ce schéma, l'expression intégrale l'expression intégrale ajoutée ou soustraite du pointeur converti est d'abord multipliée par la taille de l'objet pointé à l'origine. est d'abord multipliée par la taille de l'objet pointé à l'origine et le et le pointeur résultant est reconverti dans le type original. Pour un pointeur soustraction, le résultat de la différence entre les pointeurs de caractères caractères est également divisé par la taille de l'objet pointé à l'origine. pointé à l'origine.
De ce point de vue, les implémentations ne doivent fournir qu'un seul élément supplémentaire. supplémentaire (qui peut chevaucher un autre objet du programme) juste après la l'objet afin de satisfaire l'exigence "un après le dernier élément". exigence .
Nous pouvons en déduire que la raison en est la prévention des débordements arithmétiques, qu'une mise en oeuvre debe éviter dans l'intervalle d'un tableau et d'un passé (mais qui évidemment n'a pas besoin d'être garantie pour un élément situé un avant le premier élément d'un tableau).
Pourquoi pas un avant - est probablement (je n'en ai pas la preuve) lié au fait que les plages de pointeurs pourraient être limitées à des segments de mémoire particuliers, et placer des objets au début d'un segment de mémoire avec une arithmétique comme "un avant le premier élément" pourrait conduire à un débordement. Je dirais que la déclaration "les implémentations doivent seulement fournir un octet supplémentaire (qui peut chevaucher un autre objet dans le programme) juste après la fin de l'objet" est un indicateur clair de cette hypothèse, car la norme de l'époque abordait explicitement le sujet d'"un octet supplémentaire" à la fin, mais ne proposait rien de similaire pour le début des segments de mémoire.