Mengapa Pengiraan Saiz Tatasusunan Berbeza Di Dalam Fungsi dalam C
Apabila menghantar tatasusunan kepada fungsi, C secara automatik mereput tatasusunan menjadi penunjuk kepada elemen pertamanya. Penunjuk ini membawa alamat elemen tatasusunan pertama tetapi bukan saiznya.
Pertimbangkan contoh ini:
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
Secara utama, sizeof(point) dengan betul memberikan saiz keseluruhan array ( 12 bait). Walau bagaimanapun, dalam ujian, sizeof(arr) menghasilkan 4 bait (saiz penunjuk integer), mengakibatkan pengiraan saiz tatasusunan yang salah (tiada satu elemen).
Untuk menyelesaikan masalah ini, saiz tatasusunan mestilah jelas diluluskan sebagai parameter berasingan:
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
Perhatikan bahawa sizeof(point)/sizeof(point[0]) berfungsi untuk tatasusunan yang diperuntukkan tindanan tetapi bukan untuk tatasusunan yang diperuntukkan secara dinamik kerana ia bergantung pada mekanisme pereputan asas.
Atas ialah kandungan terperinci Mengapakah `sizeof` Memberi Saiz Tatasusunan Berbeza Di Dalam dan Di Luar Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!