When arrays are passed into functions, they undergo array-to-pointer conversion. This means an array of type T[N] will simply decay into T*. Notice how the size information has been lost. All that remains is a pointer to the first element of the array. Here is a quote from the Standard:
4.2 Array-to-pointer conversion
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue
  of type “pointer to T”. The result is a pointer to the first element of the array.
In short, sizeof( array ) returns the size of the pointer, not of the array. That's where the miscalculation derives. A simple solution would be to utilize dynamic containers like std::vector which contains its size information internally:
#include <vector>
void myFunction(std::vector<int> const &array)
{
    int size = array.size();
}
If using std::vector isn't an option, you can use a reference to an array instead while using a template argument to deduce the length:
template <unsigned N>
void myFunction(int (&array)[N])
{
    int size = N;
}