Rumah >pembangunan bahagian belakang >C++ >Adakah Mengakses Tatasusunan 2D sebagai Tatasusunan 1D Bersebelahan dalam Gelagat Tidak Ditakrifkan C?

Adakah Mengakses Tatasusunan 2D sebagai Tatasusunan 1D Bersebelahan dalam Gelagat Tidak Ditakrifkan C?

DDD
DDDasal
2024-12-22 02:08:15754semak imbas

Is Accessing a 2D Array as a Contiguous 1D Array in C Undefined Behavior?

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!

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