Adakah Aritmetik Penunjuk dengan Penunjuk Bukan Tatasusunan Kelakuan Tidak Ditakrifkan?
Piawaian C menyatakan bahawa menambah atau menolak ungkapan kamiran kepada keputusan penuding dalam penunjuk jenis yang sama. Walau bagaimanapun, jika penuding pada asalnya menunjuk kepada elemen dalam tatasusunan, penuding yang terhasil juga mesti menunjuk kepada elemen yang sah dalam tatasusunan. Ini menimbulkan persoalan: adakah tingkah laku tidak ditentukan (UB) untuk ditambahkan pada penuding "char *" yang sebenarnya tidak menunjuk kepada tatasusunan aksara?
Pertimbangkan 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;
Barisan () melakukan reinterpret_cast untuk menukar alamat f kepada penunjuk "char " dan kemudian menambah offset bagi ahli z. Penunjuk p yang terhasil digunakan untuk mengubah suai nilai f.z.
Mengikut standard, baris ini sepatutnya menghasilkan UB kerana p tidak menunjuk kepada tatasusunan aksara. Walau bagaimanapun, lazimnya diandaikan bahawa ia dibenarkan menggunakan penunjuk sedemikian untuk memanipulasi perwakilan memori asas objek.
Standard tidak menyatakan secara eksplisit bahawa ini adalah UB, tetapi ia memerlukan objek jenis boleh disalin secara remeh. disalin ke dalam tatasusunan char atau unsigned char. Ini menunjukkan bahawa aritmetik penunjuk harus ditakrifkan untuk penunjuk kepada bait mentah yang membentuk objek, membenarkan operasi di atas.
Oleh itu, adalah munasabah untuk membuat kesimpulan bahawa menambah pada penunjuk "char *" yang tidak 't menunjuk kepada tatasusunan aksara bukanlah UB dalam senario di mana bait asas bertujuan untuk disalin ke dalam tatasusunan.
Atas ialah kandungan terperinci Adakah Aritmetik Penunjuk pada Penunjuk Bukan Tatasusunan dengan Tingkah Laku Tidak Ditakrifkan `mentafsirkan_semula`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!