Bolehkah Titik Langganan Tatasusunan Melampaui Sempadan Tatasusunan?
Timbul persoalan sama ada kod berikut mematuhi Piawaian C:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Secara khusus, kesahihan &array[5] dalam konteks ini adalah di bawah penelitian.
C Standard
Mengikut piawaian draf C99:
-
§6.5.2.1, Perenggan 2: "E1[E2] adalah sama dengan (*((E1)) (E2)))"
-
§6.5.3.2, Perenggan 3 (Ditekankan): "Jika operan adalah hasil daripada pengendali [], baik operator & mahupun unary * yang tersirat oleh [] dinilai dan hasilnya seolah-olah operator & telah dialih keluar dan operator [] ditukar kepada operator."
-
§6.5.6, Perenggan 8: "Jika ungkapan P menunjuk satu melepasi elemen terakhir objek tatasusunan, ungkapan (P) 1 menunjukkan satu melepasi yang terakhir elemen objek tatasusunan, dan jika ungkapan Q menunjuk satu melepasi elemen terakhir objek tatasusunan, ungkapan (Q) - 1 menunjuk kepada elemen terakhir tatasusunan objek."
Kesimpulan
Peruntukan ini menunjukkan bahawa:
- Penunjuk boleh secara sah menunjuk satu elemen melepasi penghujung sesuatu tatasusunan (tanpa dinyahrujuk).
- &array[5] bersamaan dengan &*(array 5), yang seterusnya bersamaan dengan (tatasusunan 5).
- (tatasusunan 5) menunjuk satu melepasi hujung tatasusunan.
- Memandangkan &tatasusunan[5] tidak mengakibatkan penyahrujukan , ia sah mengikut Piawaian C.
Atas ialah kandungan terperinci Adakah `&array[5]` Penunjuk yang Sah dalam C Melangkaui Had Array?. 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