void testSizeof(double array[])
{
printf ("%i\n", sizeof(array));
}
この関数を呼び出すとき、出力は配列の長さではありません。
なんで?
それでは、出力についての事実は何ですか?
double
ポインタのサイズ、つまりを返しますsizeof(double*)
。
関数が型の引数を取る場合double[]
、これは型の引数を取るのとまったく同じdouble*
です。配列はポインタに崩壊すると言われています。
詳細については、「アレイの減衰とは」を参照してください。およびCのFAQ。
関数が配列のサイズを知る必要がある場合は、明示的に渡す必要があります。例えば:
void testSizeof(double array[10]) {...}
また
void testSizeof(double array[], size_t array_size) {...}
最初の例では、配列もポインターの減衰の影響を受けます。ただし、配列のサイズはすでにわかっているので、それを把握するために使用する必要はありませんsizeof()
。
言うまでもなく、2番目のアプローチは最初のアプローチよりもはるかに柔軟です。