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?

Dec 07 2020

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

2 告白气球 Dec 23 2020 at 16:33

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 pcomme 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, ++pfera le ppoint à l'arr l' élément (hypothétique) [1], et --pfera le ppoint sur le premier élément arr [0] à nouveau. Ainsi, dans le dernier, le pointeur de dé-référence pest OK et ne produit aucun UB.