Czy zwiększanie / zmniejszanie lub dodawanie wartości całkowitej do wskaźnika, który nie wskazuje na element w sekwencji Undefined Behavior?
Wiem, że wskaźniki (do elementu tablicy) i iteratory mogą być zwiększane / dekrementowane, aby przejść przez sekwencję elementów i mogą przeskakiwać wstecz i do elementów w sekwencji.
Ale co się stanie, jeśli zwiększę wskaźnik do pojedynczego obiektu lub dodam do niego wartość całkowitą? czy jest to niezdefiniowane zachowanie, czy jest w porządku, ale nie możemy uzyskać dostępu do tej pamięci?
int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';
Ponieważ już przeczytałem, że nie powinniśmy zwiększać / zmniejszać wskaźnika, który nie wskazuje na przykład elementu w sekwencji lub tablicy.
Czy ktoś może więc wyjaśnić, co się stanie i czy mój przykład jest w porządku (wskaźnik usuwania referencji p)? Dziękuję Ci!
Odpowiedzi
gdy arytmetyka wskaźnika dotyczy wskaźnika, który wskazuje na obiekt, uważa się, że wskaźnik wskazuje na tablicę tego typu obiektu zawierającą tylko jeden element, zgodnie z normą .
W tym celu obiekt, który nie jest elementem tablicy, jest traktowany jako należący do tablicy jednoelementowej
W twoim przykładzie wskaźnik p
tak, jakby wskazywał na int arr[1] = {551}
Więc odpowiednia operacja jest podobna do zastosowania do wskaźnika, który wskazuje na arr
. Oznacza to, ++p
że p
wskaże element arr [1] (hipotetyczny) i --p
ponownie p
wskaże pierwszy element arr [0]. Tak więc w ostatnim przypadku wskaźnik usuwania odniesienia p
jest OK i nie powoduje żadnego UB.