Perilaku yang Anda temukan sebenarnya adalah kutil besar dalam bahasa C. Setiap kali Anda mendeklarasikan fungsi yang mengambil parameter array, compiler mengabaikan Anda dan mengubah parameter menjadi pointer. Jadi semua deklarasi ini berperilaku seperti yang pertama:
void func(int *a)
void func(int a[])
void func(int a
typedef int array_plz[5];
void func(array_plz a)
a akan menjadi penunjuk ke int dalam keempat kasus. Jika Anda meneruskan sebuah array ke func, array itu akan segera meluruh menjadi pointer ke elemen pertamanya. (Pada sistem 64-bit, penunjuk 64-bit dua kali lebih besar dari int 32-bit, sehingga rasio sizeof Anda kembali 2.)
Satu-satunya tujuan aturan ini adalah untuk mempertahankan kompatibilitas mundur dengan kompiler historis yang tidak mendukung penerusan nilai agregat sebagai argumen fungsi.
Ini tidak berarti bahwa tidak mungkin meneruskan array ke suatu fungsi. Anda dapat menyiasati kutil ini dengan menyematkan array ke dalam struct (ini pada dasarnya adalah tujuan dari std :: array C ++ 11):
struct array_rly {
int a[5];
};
void func(struct array_rly a)
{
printf("%zd\n", sizeof(a.a)/sizeof(a.a[0])); /* prints 5 */
}
atau dengan meneruskan pointer ke array:
void func(const int (*a)[5])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints 5 */
}
Jika ukuran array bukan konstanta waktu kompilasi, Anda dapat menggunakan teknik pointer-ke-array dengan array panjang variabel C99:
void func(int n, const int (*a)[n])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints n */
}