Mengapa sizeof() Tidak Berfungsi Sama untuk Parameter Tatasusunan dalam Fungsi C
Dalam C , tatasusunan mereput menjadi penunjuk apabila dihantar ke fungsi, menjadikan penggunaan sizeof() tidak boleh dipercayai untuk menentukan saiz tatasusunan. Untuk memahami perkara ini, mari kita analisa fungsi berikut:
int length_of_array(int some_list[]) { return sizeof(some_list) / sizeof(*some_list); }
Isu dengan Parameter Tatasusunan
Parameter some_list diisytiharkan sebagai tatasusunan, tetapi tandatangan fungsi ialah berkesan bersamaan dengan int length_of_array(int* some_list). Ini kerana tatasusunan mereput menjadi penunjuk dalam parameter fungsi.
Kesan pada sizeof()
Menggunakan sizeof(some_list) dalam konteks ini mengira saiz penunjuk, menghasilkan dalam nilai 1. Membahagi dengan sizeof(*some_list) (saiz integer) menghasilkan 1.
Contoh
Dalam contoh yang diberikan, walaupun array num_list mengandungi 15 elemen, fungsi length_of_array() secara konsisten mengembalikan 1, seperti yang dilihat dalam output:
This is the output from direct coding in the int main function: 15 This is the length of the array determined by the length_of_array function: 1
Penyelesaian Menggunakan Templat Fungsi
Untuk menentukan saiz tatasusunan dalam fungsi, seseorang boleh menggunakan fungsi templat dan lulus tatasusunan dengan rujukan:
template<size_t N> int length_of_array(int (&arr)[N]) { return N; }
Dalam kes ini, parameter templat N menangkap saiz yang diketahui tatasusunan, membenarkan sizeof() mengembalikan nilai yang betul.
Atas ialah kandungan terperinci Mengapakah `sizeof()` Mengembalikan Keputusan Tidak Dijangka untuk Parameter Tatasusunan dalam Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!