Adakah Aritmetik Penunjuk pada Struktur Data Bukan Tatasusunan Kelakuan Tidak Ditakrifkan?
Persoalan timbul daripada konflik jelas antara piawaian C 17 berkenaan penunjuk penambahan dan kefungsian offsetof makro. Menurut perenggan yang dipetik, menambah pada penunjuk "char " seharusnya menghasilkan gelagat yang tidak ditentukan jika ia tidak menghala ke tatasusunan char. Walau bagaimanapun, contoh kod yang disediakan melibatkan penambahan pada penunjuk "char " yang diperoleh daripada reinterpret_casting alamat struct "Foo". Ini nampaknya tidak mengikut peraturan, kerana penuding tidak menghala ke tatasusunan aksara.
Walau bagaimanapun, setelah pemeriksaan lanjut standard, kami mendapat panduan dalam bahagian 3.9.2: "Untuk sebarang objek (selain daripada subobjek kelas asas) jenis T yang boleh disalin secara remeh, sama ada objek itu memegang nilai jenis T yang sah atau tidak, bait asas yang membentuk objek boleh disalin ke dalam tatasusunan char atau unsigned char."
Pernyataan ini mencadangkan bahawa piawaian menganggap bait asas mana-mana objek sebagai boleh disalin, tidak kira sama ada ia mewakili tatasusunan. Ini menunjukkan bahawa penambahan yang anda lakukan dalam kod anda harus sah, walaupun penunjuk tidak menunjuk ke tatasusunan. Penambahan ditakrifkan pada bait mentah dan nilai yang terhasil digunakan untuk mengakses ahli apungan yang diingini bagi struct "Foo".
Oleh itu, operasi penambahan dalam contoh kod yang disediakan bukanlah gelagat yang tidak ditentukan. Ia membolehkan anda mengakses dan mengubah suai bait yang mewakili ahli struct menggunakan reinterpret_casting dan offsetof.
Atas ialah kandungan terperinci Adakah Aritmetik Penunjuk pada Struktur Data Bukan Tatasusunan Ditakrifkan atau Kelakuan Tidak Ditakrifkan dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!