Rumah >pembangunan bahagian belakang >C++ >Adakah Mengakses Tatasusunan 2D sebagai Tatasusunan 1D Bersebelahan dalam Gelagat Tidak Ditakrifkan C?
Bolehkah Tatasusunan 2D Diperlakukan sebagai Tatasusunan 1D Bersebelahan?
Langganan dalam C menghasilkan penambahan penunjuk diikuti dengan pengasingan. Pertimbangkan kod berikut:
int a[25][80]; a[0][1234] = 56; int* p = &a[0][0]; p[1234] = 56;
Adakah baris kedua menimbulkan gelagat yang tidak ditentukan? Bagaimana pula dengan baris keempat?
Jawapan:
Kedua-dua baris memang menghasilkan tingkah laku yang tidak ditentukan.
Seperti C standard, penambahan penunjuk kepada elemen tatasusunan menghasilkan tingkah laku yang sah hanya jika indeks yang terhasil berada dalam sempadan tatasusunan. Dalam kes ini, a[0] mempunyai saiz 80 dan indeks di luar julat ini tidak ditentukan.
Penjelasan:
Langganan adalah bersamaan dengan yang berikut:
a[0][1234] == *(a[0] + 1234)
Memandangkan a[0] menunjuk ke elemen pertama baris pertama a, penambahan penunjuk a[0] 1234 cuba mengakses elemen di luar penghujung baris. Ini mengakibatkan tingkah laku yang tidak ditentukan.
Begitu juga, baris keempat cuba mengubah suai nilai di luar sempadan baris:
p[1234] == *(p + 1234)
Walaupun p menunjuk kepada elemen pertama a, cuba untuk mengubah suai elemen di luar sempadan baris asasnya menghasilkan gelagat yang tidak ditentukan.
Adalah penting untuk diperhatikan bahawa jenis tingkah laku yang tidak ditentukan ini tidak dikesan oleh pengkompil. Oleh itu, adalah penting untuk memastikan bahawa operasi aritmetik penunjuk kekal dalam sempadan elemen tatasusunan yang sah semasa masa jalan.
Atas ialah kandungan terperinci Adakah Mengakses Tatasusunan 2D sebagai Tatasusunan 1D Bersebelahan dalam Gelagat Tidak Ditakrifkan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!