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
Lepaskan: 2024-12-15 17:48:12
asal
1065 orang telah melayarinya

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
Salin selepas log masuk

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);
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan