c++で配列の長さを求める方法として、配列全体のバイト数/配列の要素の型のバイト数 で求める方法がよく知られている。
int array[] = {1, 2, 3, 4, 5, 5, 5, 5, 5};
cout << sizeof(array) << endl; // 36
cout << sizeof(array[0]) << endl; // 4
cout << "arrayの長さ: " << sizeof(array) / sizeof(array[0]) << endl; // arrayの長さ:9
しかし、関数の引数となっている配列をsizeof演算子に適用すると、上記とは異なる結果となる
size_t arr_size(int arr[])
{
return sizeof(arr);
}
int array[] = {1, 2, 3, 4, 5, 5, 5, 5, 5};
cout << sizefunc(array) << endl; // 8(上記と異なる)
cout << "arrayの長さ: " << sizefunc(array) / sizeof(array[0]) << endl; // arrayの長さ:2
原因がよくわからないが、引数の場合はポインタ型になる(=> sizeof(arr) -> sizeof(int *) となる?)から?
関数内で配列のサイズを求めるのではなく、関数の引数に配列そのものに加えて、配列のサイズも追加する方法がよく見られる気がする。