Using sizeof on arrays passed as parameters [duplicate]

Solution 1:

What causes this inconsistency?

The name of the array decays as an pointer to its first element.
When you pass an array to an function, this decaying takes place and hence the expression passed to sizeof is a pointer thus returning pointer size.

However, an array passed to sizeof always returns size of the array because there is no decaying to an pointer in this case.

What is the best way of getting the size of an array when it is passed as a parameter?

Don't pass them by value, pass them by reference or
Pass size as an separate argument to the function.

Solution 2:

You have to pass the array by reference; you cannot pass arrays by value (they decay into pointers to the first element):

int myFunc(char const (& my_array)[5])
{
    return sizeof(my_array);  // or just "return 5"
}

In case that you want to call this function with a reference to lots of different local arrays, you can use a function template instead to have the array size deduced:

template <unsigned int N>
int myFunc(char const (& my_array)[N])
{
    return sizeof(N);         // or "return N"
}

You should really make the functions return an unsigned int or an std::size_t, though. In C++11, you can also declare them as constexpr.