Rumah >pembangunan bahagian belakang >C++ >Adakah Mendapatkan Alamat Selepas Penghujung Tatasusunan C melalui Langganan Sah?

Adakah Mendapatkan Alamat Selepas Penghujung Tatasusunan C melalui Langganan Sah?

Patricia Arquette
Patricia Arquetteasal
2024-12-20 11:07:10872semak imbas

Is Obtaining the Address One Past the End of a C   Array via Subscripting Legal?

Menyiasat Kesahihan Pemerolehan Alamat Tatasusunan Satu-Akhir

Soalannya

Dalam C , bolehkah alamat elemen tatasusunan satu masa yang lepas dari penghujungnya diperoleh melalui langganan, seperti yang ditunjukkan dalam kod berikut coretan?

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];

Secara khusus, adakah &array[5] mematuhi Piawaian C?

Jawapannya

Ya, kod itu mematuhi Piawaian C.

Penjelasan

Mengikut draf C99 standard:

§6.5.2.1, perenggan 2:

Ungkapan postfix diikuti dengan ungkapan dalam kurungan segi empat sama [] ialah sebutan subskrip bagi elemen tatasusunan objek.

§6.5.3.2, perenggan 3:

Jika operan [bagi & operator] ialah hasil daripada operator [], baik & operator mahupun unary * yang tersirat oleh [] tidak dinilai dan hasilnya adalah seolah-olah operator & telah dialih keluar dan operator [] ditukar kepada operator.

§6.5.6, perenggan 8:

Jika ungkapan P menunjuk ke elemen terakhir objek tatasusunan, ungkapan (P) 1 menunjukkan satu melepasi elemen terakhir objek tatasusunan.

Berdasarkan petikan ini:

  • Pengendali & menghasilkan alamat penuding operan.
  • Apabila digunakan pada hasil pengendali [], operator & boleh dialih keluar dan operator [] menjadi operator.
  • Ungkapan yang menunjuk kepada elemen terakhir tatasusunan boleh secara sah menunjuk satu melepasi hujung tatasusunan.

Oleh itu, ungkapan &array[5] adalah bersamaan dengan *(array 5), yang menunjukkan satu melepasi elemen tatasusunan terakhir. Ini adalah sah mengikut Piawaian, selagi penunjuk tidak dinyahrujuk.

Atas ialah kandungan terperinci Adakah Mendapatkan Alamat Selepas Penghujung Tatasusunan C melalui Langganan Sah?. 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