Mengapa Menghantar Tatasusunan kepada Fungsi Mengubah Nilai saiz()nya
Dalam pengaturcaraan C, menghantar tatasusunan kepada fungsi boleh membawa kepada tingkah laku yang tidak dijangka mengenai saiznya apabila mendapatkannya menggunakan sizeof(). Keanehan ini timbul disebabkan oleh konsep pereputan tatasusunan.
Reput Tatasusunan Dijelaskan
Apabila tatasusunan dihantar kepada fungsi, ia secara tersirat ditukar atau "mereput" menjadi penunjuk kepada elemen pertamanya. Penukaran ini secara berkesan menyembunyikan saiz sebenar tatasusunan, kerana sizeof() kini beroperasi pada penuding berbanding tatasusunan asal.
Contoh dengan Kod
Pertimbangkan coretan kod berikut :
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (incorrect) } int main(int argc, const char * argv[]) { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); printf("%d\n", arrSize); // 3 (correct) test(point); return 0; }
Dalam contoh ini, dua panggilan ke sizeof() dibuat. Panggilan pertama, dalam fungsi main(), mengembalikan saiz titik tatasusunan sebagai 3 dengan betul. Walau bagaimanapun, panggilan kedua dalam fungsi test() salah mengembalikan 2. Hasil ketidakpadanan ini berlaku kerana titik tatasusunan mereput menjadi penunjuk apabila ia diserahkan kepada fungsi.
Mengatasi Pereputan Tatasusunan
Untuk mengekalkan yang benar saiz tatasusunan apabila dihantar ke fungsi, seseorang mesti secara eksplisit menghantar parameter tambahan kepada fungsi yang menentukan saiz.
void test(int arr[], size_t elems) { /* ... */ } int main(int argc, const char * argv[]) { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point)/sizeof(point[0])); /* ... */ }
Dengan menghantar saiz sebagai parameter berasingan, fungsi boleh menentukan dengan tepat saiz tatasusunan dan lakukan operasi dengan sewajarnya.
Nota:
The helah sizeof(point)/sizeof(point[0]) untuk mendapatkan saiz tatasusunan mungkin tidak selalu berfungsi untuk tatasusunan yang diperuntukkan secara dinamik.
Atas ialah kandungan terperinci Mengapakah `sizeof()` Mengembalikan Nilai Berbeza untuk Tatasusunan Dalam dan Luar Fungsi dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!