Est-ce que l'incrémentation / décrémentation ou l'ajout d'une valeur entière à un pointeur qui ne pointe pas vers un élément dans une séquence Comportement non défini?
Je sais que les pointeurs (vers un élément de tableau) et les itérateurs peuvent être incrémentés / décrémentés pour parcourir une séquence d'éléments et peuvent sauter en arrière et pour des éléments dans la séquence.
Mais que se passera-t-il si j'incrémente un pointeur vers un seul objet ou si j'y ajoute une valeur entière? est-ce un comportement non défini ou est-ce correct mais nous ne pouvons pas accéder à cette mémoire?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
Parce que j'ai déjà lu qu'il ne faut pas incrémenter / décrémenter un pointeur qui ne pointe pas vers un élément dans une séquence ou un tableau par exemple.
Alors quelqu'un peut-il expliquer ce qui va se passer et si mon exemple est OK (pointeur de dé-référencement p)? Je vous remercie!
Réponses
lorsque l'arithmétique du pointeur s'applique à un pointeur qui pointe vers un objet, le pointeur est considéré comme pointant vers un tableau de ce type d'objet avec un seul élément, comme indiqué dans la norme .
Un objet qui n'est pas un élément de tableau est considéré comme appartenant à un tableau à un seul élément à cette fin
Dans votre exemple, le pointeur p
comme s'il pointait sur int arr[1] = {551}
So, l'opération correspondante est similaire à s'appliquer à un pointeur qui pointe vers le arr
. Cela signifie, ++p
fera le p
point à l'arr l' élément (hypothétique) [1], et --p
fera le p
point sur le premier élément arr [0] à nouveau. Ainsi, dans le dernier, le pointeur de dé-référence p
est OK et ne produit aucun UB.