Rumah >pembangunan bahagian belakang >C++ >Mengapa Merawat Tatasusunan 2D sebagai Tatasusunan 1D dalam C/C Membawa kepada Gelagat Tidak Ditakrifkan?

Mengapa Merawat Tatasusunan 2D sebagai Tatasusunan 1D dalam C/C Membawa kepada Gelagat Tidak Ditakrifkan?

Patricia Arquette
Patricia Arquetteasal
2024-12-15 17:48:12973semak imbas

Why Does Treating a 2D Array as a 1D Array in C/C   Lead to Undefined Behavior?

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!

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