Массив может быть представлен по разному.
Для статического массива sizeof(arr) сразу возвращает размер массива в байтах.
Для указателя на массив sizeof(ptr_arr) возвращает размер указателя. Чтоб получить размер массива в этом случае надо сделать sizeof(ptr_arr[0])*N.
Когда вы передает в функцию статический массив, то внутри функции это все равно указатель (не смотря на то, что в аргументе он может быть объявлен как int arr[N]) и sizeof над ним ведет себя как с указателем, а не как с массивом.
Вариант sizeof(arr[0])*N будет правильно работать как с указателем так и со статическим массивом.
При этом реального обращения к памяти arr[0] не происходит, поэтому этот вариант можно использовать даже в таком случае:
int *ptr_arr=NULL;
size_t size_arr = sizeof(ptr_arr[0])*N;