Apakah incrementing / decrementing atau menambahkan nilai integer ke pointer yang tidak menunjuk ke elemen dalam urutan Undefined Behavior?

Dec 07 2020

Saya tahu bahwa pointer (ke elemen array) dan iterator dapat ditambah / dikurangi untuk menjalankan urutan elemen dan dapat melompat mundur-dan-untuk elemen dalam urutan.

Tetapi apa yang akan terjadi jika saya menambahkan pointer ke satu objek atau menambahkannya dengan nilai integer? apakah ini perilaku yang tidak terdefinisi atau tidak masalah tetapi kita tidak dapat mengakses memori itu?

int x = 551;
int* p = &x;
++p;
--p;
std::cout << *p << '\n';

Karena saya sudah membaca bahwa kita tidak boleh menaikkan / menurunkan pointer yang tidak menunjuk ke elemen dalam urutan atau array misalnya.

Jadi dapatkah seseorang menjelaskan apa yang akan terjadi dan apakah contoh saya OK (penunjuk de-referensi p)? Terima kasih!

Jawaban

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

ketika aritmatika penunjuk diterapkan ke penunjuk yang menunjuk ke suatu objek, penunjuk dianggap menunjuk ke larik dari tipe objek itu dengan hanya satu elemen, seperti yang dikatakan dalam standar .

Objek yang bukan elemen array dianggap milik array elemen tunggal untuk tujuan ini

Dalam contoh Anda, penunjuk pseolah-olah menunjuk ke int arr[1] = {551}Jadi, operasi terkait serupa untuk diterapkan ke penunjuk yang mengarah ke arr. Artinya, ++pakan pmenunjuk ke elemen arr [1] (hipotetis), dan --pakan pmenunjuk ke elemen pertama arr [0] lagi. Jadi, pada poin terakhir, penunjuk de-referensi pOK dan tidak menghasilkan UB.