Bulduğunuz davranış aslında C dilinde büyük bir siğil. Bir dizi parametresi alan bir işlevi her bildirdiğinizde, derleyici sizi yok sayar ve parametreyi bir işaretçi olarak değiştirir. Yani bu beyannamelerin hepsi ilki gibi davranır:
void func(int *a)
void func(int a[])
void func(int a
typedef int array_plz[5];
void func(array_plz a)
a, dört durumda da int'e bir gösterici olacaktır. Bir diziyi func'a geçirirseniz, hemen ilk elemanına bir göstericiye dönüşür. (64 bitlik bir sistemde, 64 bitlik bir işaretçi 32 bitlik bir int'in iki katı büyüklüğündedir, bu nedenle sizeof oranınız 2'yi döndürür.)
Bu kuralın tek amacı, toplam değerleri işlev bağımsız değişkenleri olarak geçirmeyi desteklemeyen geçmiş derleyicilerle geriye dönük uyumluluğu korumaktır.
Bu, bir diziyi bir işleve aktarmanın imkansız olduğu anlamına gelmez. Diziyi bir yapıya yerleştirerek bu siğilden kurtulabilirsiniz (bu temelde C ++ 11'in std :: array'in amacıdır):
struct array_rly {
int a[5];
};
void func(struct array_rly a)
{
printf("%zd\n", sizeof(a.a)/sizeof(a.a[0])); /* prints 5 */
}
veya diziye bir işaretçi ileterek:
void func(const int (*a)[5])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints 5 */
}
Dizi boyutunun bir derleme zamanı sabiti olmaması durumunda, C99 değişken uzunluklu dizilerle diziye işaretçi tekniğini kullanabilirsiniz:
void func(int n, const int (*a)[n])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints n */
}