Rumah >pembangunan bahagian belakang >C++ >Mengapa Merawat Tatasusunan 2D sebagai Tatasusunan 1D dalam C/C Membawa kepada Gelagat Tidak Ditakrifkan?
Merawat Tatasusunan 2D sebagai Tatasusunan 1D: Tingkah Laku Tidak Ditakrifkan
Dalam C dan C , tatasusunan berbilang dimensi disimpan bersebelahan dalam ingatan. Walau bagaimanapun, mengakses tatasusunan berbilang dimensi menggunakan pengindeksan satu dimensi boleh membawa kepada gelagat yang tidak ditentukan.
Pertimbangkan kod berikut:
int a[25][80]; a[0][1234] = 56; // Line 2 int* p = &a[0][0]; p[1234] = 56; // Line 4
Baris 2:
Ini baris cuba mengakses elemen yang berada di luar sempadan tatasusunan a[25][80]. Dimensi pertama a mempunyai saiz 25, tetapi baris 2 cuba mengakses elemen ke-1235, yang berada di luar julat yang sah. Ini mengakibatkan tingkah laku yang tidak ditentukan kerana ia melanggar definisi bahasa.
Baris 4:
Baris ini juga mencetuskan tingkah laku yang tidak ditentukan. Tatasusunan a mempunyai 25 * 80 = 2000 elemen, manakala p menunjuk ke permulaan tatasusunan. Oleh itu, ungkapan p[1234] cuba mengakses elemen ke-1235 tatasusunan, yang berada di luar julat yang sah. Melanggan tatasusunan menggunakan penuding yang melebihi hadnya dianggap gelagat tidak ditentukan.
Ungkapan Malar:
Tingkah laku tidak ditentukan dalam kod di atas juga menjelma dalam ungkapan malar. Kod berikut tidak akan dihimpun kerana kelakuan yang tidak ditentukan:
constexpr int f(const int (&a)[2][3]) { auto p = &a[0][0]; return p[3]; // Undefined behavior } int main() { constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, }; constexpr int i = f(a); }
Ini menunjukkan bahawa kelakuan tidak ditentukan dalam ungkapan berterusan masih menyalahi undang-undang dan pengkompil akan menolak kod tersebut.
Atas ialah kandungan terperinci Mengapa Merawat Tatasusunan 2D sebagai Tatasusunan 1D dalam C/C Membawa kepada Gelagat Tidak Ditakrifkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!