Menambah pada "char *" Penunjuk: UB atau Tidak?
C 17 mentakrifkan peraturan untuk menambah ungkapan integral pada penunjuk, menyatakan bahawa tingkah laku yang tidak ditentukan terhasil apabila hasilnya melebihi had tatasusunan menunjuk ke. Walau bagaimanapun, takrifan berkaitan khusus dengan penunjuk yang menunjuk kepada unsur tatasusunan.
Pertimbangkan coretan kod berikut:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
Timbul persoalan sama ada baris (*) mencetuskan gelagat yang tidak ditentukan. Walaupun mentafsir semula alamat kepada apungan sebagai penunjuk char, ia tidak menunjuk kepada tatasusunan char. Oleh itu, menurut definisi yang disebutkan, ia kelihatan seperti tingkah laku yang tidak ditentukan. Namun, kegunaan makro pengimbang akan terjejas teruk jika itu berlaku.
Walau bagaimanapun, C juga membenarkan menyalin bait asas bagi mana-mana jenis yang boleh disalin secara remeh ke dalam tatasusunan aksara. Operasi ini, yang boleh dilakukan menggunakan fungsi seperti std::memcpy atau bait demi bait secara manual, tidak memerlukan objek asal menjadi tatasusunan.
Oleh itu, untuk membolehkan operasi mengikut bait ini berjaya, penambahan ungkapan kamiran kepada penunjuk mesti ditakrifkan untuk penunjuk yang menunjuk kepada bait mentah objek. Sama ada bait ini secara tersirat membentuk tatasusunan atau membentuk pengecualian khas kepada peraturan penambahan am adalah tidak jelas. Walau bagaimanapun, mana-mana tafsiran akan membenarkan kesahihan penambahan dalam contoh kod yang disediakan. Oleh itu, menambah pada penunjuk "char *" dalam konteks ini tidak menimbulkan gelagat yang tidak ditentukan.
Atas ialah kandungan terperinci Adakah Menambah pada 'char *' Tingkah Laku Tidak Ditakrifkan Penunjuk Apabila Ia Tidak Menuding pada Tatasusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!