Array dalam Tandatangan Fungsi: Anomali Ingin tahu dalam C dan C
Dalam C dan C , panjang tatasusunan biasanya dinyatakan dalam tandatangan fungsi menggunakan sintaks int a[saiz]. Walau bagaimanapun, tingkah laku ingin tahu timbul apabila tempoh ini tidak dikuatkuasakan.
Kes Misteri dis(char a[1])
Pertimbangkan coretan kod berikut:
#include <iostream> using namespace std; int dis(char a[1]) { int length = strlen(a); char c = a[2]; // Attempt to access element beyond specified length return length; } int main() { char b[4] = "abc"; int c = dis(b); cout << c; return 0; }
Dalam contoh ini, fungsi dis mengisytiharkan parameter tatasusunan a bersaiz 1. Walau bagaimanapun, atur cara mengakses elemen melebihi saiz ini tanpa sebarang ralat pengkompil. Ini menimbulkan persoalan: mengapa pengkompil membenarkan panjang tatasusunan dalam tandatangan fungsi jika ia tidak dikuatkuasakan?
Ciri Bahasa Yang Aneh
Jawapannya terletak pada cara C dan C mengendalikan tatasusunan dalam panggilan fungsi. Pada hakikatnya, tatasusunan tidak boleh dihantar terus ke fungsi. Sebaliknya, penunjuk kepada elemen pertama tatasusunan dihantar, tidak membawa maklumat tentang panjang tatasusunan.
Oleh itu, saiz yang dinyatakan dalam tandatangan fungsi ([1] dalam kes ini) diabaikan oleh pengkompil . Keputusan ini bermula sejak tahun 1970-an dan telah menyebabkan kekeliruan yang ketara dalam kalangan pembangun.
Implikasi untuk Pengaturcaraan
Keanehan ini mempunyai beberapa implikasi:
Walaupun tingkah laku ini mungkin kelihatan membingungkan, ia adalah sebahagian daripada C dan bahasa pengaturcaraan C. Memahami implikasinya adalah penting untuk pembangunan kod yang selamat dan cekap.
Atas ialah kandungan terperinci Mengapa Pengkompil C dan C Mengabaikan Panjang Tatasusunan dalam Tandatangan Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!