シーケンス内の要素を指していないポインタに整数値をインクリメント/デクリメントまたは追加することは未定義の動作ですか?
Dec 07 2020
(配列要素への)ポインターとイテレーターは、要素のシーケンスをウォークするためにインクリメント/デクリメントでき、シーケンス内の要素を前後にジャンプできることを知っています。
しかし、単一のオブジェクトへのポインターをインクリメントしたり、それに整数値を追加したりするとどうなりますか?それは未定義の動作ですか、それとも問題ありませんが、そのメモリにアクセスできませんか?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
たとえば、シーケンスまたは配列内の要素を指していないポインタをインクリメント/デクリメントしてはならないことをすでに読んだためです。
それで、誰かが何が起こるか、そして私の例が大丈夫かどうかを説明できますか(ポインターpの参照解除)?ありがとうございました!
回答
2 告白气球 Dec 23 2020 at 16:33
ポインタ演算がオブジェクトを指すポインタに適用される場合、標準で述べられているように、ポインタは1つの要素のみを持つそのオブジェクトタイプの配列を指していると見なされます。
配列要素ではないオブジェクトは、この目的のために単一要素の配列に属していると見なされます
あなたの例では、ポインターp
がint arr[1] = {551}
Soを指しているかのように、対応する操作は、を指すポインターに適用するのと似ていますarr
。つまり、++p
はp
要素arr [1](仮想)--p
をp
ポイントし、最初の要素arr [0]を再びポイントします。したがって、最後に、ポインターの参照解除p
はOKであり、UBにはなりません。