const ptrdiff_t ptrDiff = p1 - p2;
C'est un comportement non défini. La soustraction entre deux pointeurs n'est bien définie que s'ils pointent vers des éléments du même tableau. ( [expr.add] ¶5.3 ).
Lorsque deux expressions pointées P
y Q
sont soustraits, le type du résultat est un type d'intégrale signée défini par l'implémentation ; ce type doit être le même que celui qui est défini en tant que std::ptrdiff_t
dans le <cstddef>
([support.types]).
- Si
P
y Q
évaluent tous deux à des valeurs de pointeur nulles, le résultat est 0.
- Sinon, si P et Q désignent respectivement des éléments
x[i]
y x[j]
du même objet du tableau x
l'expression P - Q
a la valeur ij
.
- Sinon, le comportement est indéfini
Et même s'il existait un moyen hypothétique d'obtenir cette valeur de manière légale, même cette sommation est illégale, car même une sommation pointeur+nombre entier doit rester dans les limites du tableau ( [expr.add] ¶4.2 )
Lorsqu'une expression J
qui est de type intégral est ajouté ou soustrait d'une expression P
de type pointeur, le résultat a le type de P
.
- Si
P
est évalué à une valeur de pointeur nulle et J
est égal à 0, le résultat est un pointeur de valeur nulle.
- Sinon, si
P
pointe vers l'élément x[i]
d'un objet de type tableau x
avec n éléments, 81 les expressions P + J
y J + P
(où J
a la valeur j
) pointent vers l'élément (peut-être hypothétique) x[i+j]
si 0i+jn
et l'expression P - J
pointe vers l'élément (peut-être hypothétique) x[ij]
si 0ijn
.
- Sinon, le comportement est indéfini.
3 votes
Il n'y a même pas de garantie que
int
les objets sontsizeof(int)
aligné (c'est le cas sur toutes les ABI que je connais, mais il y a des exceptions à presque toutes les règles en programmation, donc certaines ABI peuvent ne pas être ainsi) ; quand ce n'est pas le cas, le code ne peut évidemment pas être garanti de fonctionner.1 votes
@curiousguy Il n'y a pas de raison particulière de ne pas aligner sur les limites d'octets sur Intel, si ce n'est les performances. Si au lieu de
int
nous avons utiliséstruct i5 { int i[5]; };
en pratiquep1
yp2
ne serait passizeof(i5)
alignés.0 votes
Une question complémentaire (bien qu'elle ait été posée plus tôt) : Quelle est la raison d'être des limitations sur l'arithmétique ou la comparaison des pointeurs ?