Ваша функция calculate()
, учитывая только аргумент указателя s
, не может рассчитать размер массива.Размер массива не закодирован в указателе или недоступен из указателя.Если он предназначен для использования строки с нулевым символом в конце в качестве аргумента, он может определить, какова длина этой строки;это то, что strlen()
делает, конечно.Но если он хочет знать, сколько информации он может безопасно скопировать в массив, ему нужно сообщить, насколько большой массив, или предположить, что места достаточно.
Как указали другие,оператор sizeof()
может использоваться в функции, где видимо определение массива, чтобы получить размер массива.Но в функции, которая не может видеть определение массива, вы не можете с пользой применять оператор sizeof()
.Если бы массив представлял собой глобальную переменную, чье определение (а не объявление) находилось в области видимости (видимой), где было написано calculate()
, а не, следовательно, параметр функции - тогда calculate()
мог бы указывать размер.
Вот почему многие, многие функции C принимают указатель и длину.Отсутствие информации объясняет, почему C в некоторой степени склонен к тому, что люди злоупотребляют ею и выдают ошибки «переполнения буфера», когда код пытается поместить галлон информации в пинту.