Mengapa Kelakuan Aritmetik Penunjuk Luar Sempadan Tidak Ditakrifkan?
Aritmetik penunjuk di luar sempadan, seperti yang ditunjukkan oleh coretan kod di bawah, dianggap gelagat tidak ditentukan dalam C .
int arr[4] = {0, 1, 2, 3}; int* p = arr + 5; // Undefined behavior
Bertentangan dengan jangkaan bahawa penunjuk harus berkelakuan seperti integer, ia mempunyai ciri unik. Inti isu ini terletak pada piawaian C itu sendiri, secara eksplisit mengklasifikasikan manipulasi penuding luar sempadan sebagai gelagat yang tidak ditentukan.
Walaupun benar bahawa pada kebanyakan platform, aritmetik penuding melebihi had tatasusunan tidak akan menghasilkan ranap atau gelagat anomali selagi penuding kekal tidak dirujuk, seseorang mesti mempersoalkan tujuan aritmetik tersebut jika ia tidak bertujuan untuk digunakan.
Walau bagaimanapun, spesifikasi C 11 secara eksplisit mengakui bahawa ungkapan yang melebihi penghujung tatasusunan dengan tepat. satu secara teknikalnya "betul" dan tidak akan menyebabkan ranap. Walau bagaimanapun, keputusannya tidak ditentukan, manakala ungkapan yang melepasi lebih daripada satu sempadan tatasusunan ialah gelagat yang tidak ditentukan sepenuhnya.
Adalah penting untuk menekankan bahawa walaupun membenarkan akses ke dalam satu kedudukan melepasi hujung tatasusunan, ini tidak membayangkan keselamatan . Membaca atau menulis data dalam julat lanjutan ini berkemungkinan besar akan memanipulasi data di luar sempadan tatasusunan, yang membawa kepada kerosakan memori dan keadaan tidak konsisten.
Rasional di sebalik pendirian ketat ini mengenai aritmetik penunjuk di luar sempadan ialah kerumitan potensi senario di mana aritmetik penunjuk boleh membawa kepada situasi berbahaya. Oleh itu, untuk mengelakkan ketidakkonsistenan dan mengekalkan konsistensi, adalah dianggap lebih mudah untuk melarang kelakuan sedemikian sama sekali.
Atas ialah kandungan terperinci Mengapakah Aritmetik Penunjuk Luar Sempadan dalam C Dianggap Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!