>>751
関数の引数として渡された配列名は、自動的に配列の先頭要素へのポインタに変換される。
配列とポインタに関してよく見かける説明文だと思うが、これに引っかかってる。

int Count(int arr[]);
int Count2(int *arr);
2つの関数は仮引数の表現(arr[], *arr)は違うが、まったく同じということ。
どちらの arr も int *arr (int型変数へのポインタ)として扱われる。

これにより、関数の返り値 sizeof(arr) / sizeof(int) の意味は、
どちらの関数でも sizeof(int*) / sizeof(int) である。
「int型ポインタを格納するのに要するメモリサイズと、intの値を格納するのに要する
メモリサイズの比」という、あまり意味のない値を計算しているのだ。


で、呼び出された関数の側で、引数の配列に含まれる要素数を知る方法。
配列の要素数は、自動的には関数に渡されないので、
「関数の引数として配列の要素数も与える」のが一般的。

extern int func(int arr[], int elems); /* 外部関数の場合 */

int main() {
 int array[10];
 int result;

 result = func(array, sizeof(array)/sizeof(array[0]));
}


(注意) sizeof() は関数でなく演算子。
sizeof(array) のarrayはポインタには変換されないので
期待通り array[10] のバイト数が得られる。