Две вещи, которые нужно помнить о массивах в C:
За исключением случаев, когда это операнд оператора sizeof
или унарный &
или строковый литерал, используемый дляинициализировать другой массив в объявлении, выражение типа «массив N-элементов из T
» будет заменено («decay to») выражением типа «указатель на T
», значением которого является адрес первогоэлемент массива.
В контексте объявления параметров функции T a[]
и T a[N]
идентичны T *a
;IOW, a
объявлен как указатель на T
, а не как массив.Обратите внимание, что это верно только для объявлений параметров функции.
Когда вы вызываете average(scores)
из своей основной функции, выражение scores
будет заменено другим выражением типа double *
, так что average
получает указатель значение, а не массив.Таким образом, уловка sizeof
для получения количества элементов не будет работать в функции average
.Вам нужно будет передать количество элементов в scores
как отдельный параметр, например, так:
double average(double *scores, size_t count)
{
...
}
и назвать его как
average(scores, sizeof scores / sizeof *scores); // or pass a constant 3, or
// something similar.