Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Menambah pada 'char *' Tingkah Laku Tidak Ditakrifkan Penunjuk Apabila Ia Tidak Menuding pada Tatasusunan?

Adakah Menambah pada 'char *' Tingkah Laku Tidak Ditakrifkan Penunjuk Apabila Ia Tidak Menuding pada Tatasusunan?

Linda Hamilton
Linda Hamiltonasal
2024-11-10 14:41:02486semak imbas

Is Adding to a

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn