Rumah > pembangunan bahagian belakang > C++ > Adakah Mengambil Alamat Satu Melepasi Penghujung Array C Sah?

Adakah Mengambil Alamat Satu Melepasi Penghujung Array C Sah?

Susan Sarandon
Lepaskan: 2024-12-26 07:18:45
asal
399 orang telah melayarinya

Is Taking the Address One Past the End of a C   Array Legal?

Adakah Mengambil Alamat Elemen Tatasusunan Satu Melepasi Tamat Dibenarkan oleh Piawaian C?

Coretan kod di bawah telah membangkitkan perbincangan tentang kesahihannya mengikut Piawaian C:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Salin selepas log masuk

Secara khusus, adalah &array[5] ungkapan C undang-undang dalam konteks ini?

Legaliti Mengikut Piawaian C

C Standard mentakrifkan kesahihan ungkapan ini:

  • C 17 Standard 6.5.2.1, Perenggan 2: Mentakrifkan E1[E2] sama dengan (*((E1) (E2))).
  • C 17 Standard 6.5.3.2, Perenggan 3: Nyatakan bahawa untuk ungkapan [], & operator dan * yang tersirat tidak dinilai, mengakibatkan &(E1 E2).
  • C 17 Standard 6.5.6, Perenggan 8: Membenarkan penuding menuding satu elemen melepasi penghujung tatasusunan, tetapi melarang membatalkan rujukannya.

Tafsiran

Dengan menggunakan peraturan ini pada &array[5], kami mempunyai:

&array[5] = &*(array + 5) = (array + 5)
Salin selepas log masuk

Memandangkan (tatasusunan 5) menunjuk satu melepasi hujung tatasusunan dan tidak dinyahrujuk, ia adalah ungkapan undang-undang mengikut Piawaian C.

Perbandingan dengan Piawaian C

Tingkah laku ini juga konsisten dengan Piawaian C, yang membenarkan pengambilan alamat elemen di luar penghujung tatasusunan, sekali lagi dengan syarat ia tidak dinyahrujuk.

Sebab Rawatan Berbeza

Keputusan untuk merawat tatasusunan 5 dan &tatasusunan[4] 1 berbeza berakar umbi dalam tujuan berbeza ungkapan ini:

  • tatasusunan 5 memberikan penunjuk satu masa lalu penghujung tatasusunan, membenarkan perbandingan dan melangkaui sempadan tatasusunan.
  • &tatasusunan[4] 1 percubaan untuk membuat rujukan kepada unsur yang tidak wujud, yang akan membawa kepada tingkah laku yang tidak ditentukan.

Atas ialah kandungan terperinci Adakah Mengambil Alamat Satu Melepasi Penghujung Array C Sah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
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