Для динамических массивов ( malloc или C ++ new ) вам необходимо сохранить размер массива, как упоминалось другими, или, возможно, построить структуру менеджера массива, которая обрабатывает добавление, удаление, считать и т. д. К сожалению, C не делает это почти так же хорошо, как C ++, поскольку в основном вам приходится создавать его для каждого сохраняемого вами типа массива, что обременительно, если у вас есть несколько типов массивов, которыми нужно управлять.
Для статических массивов, таких как в вашем примере, есть общий макрос, используемый для получения размера, но он не рекомендуется , так как он не проверяет, является ли параметр действительно статическим массивом , Макрос используется в реальном коде, например, например. в заголовках ядра Linux, хотя он может немного отличаться от приведенного ниже:
#if !defined(ARRAY_SIZE)
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))
#endif
int main()
{
int days[] = {1,2,3,4,5};
int *ptr = days;
printf("%u\n", ARRAY_SIZE(days));
printf("%u\n", sizeof(ptr));
return 0;
}
Вы можете гуглить по причинам, опасающимся подобных макросов. Будьте осторожны.
Если возможно, C ++ stdlib, такой как vector, намного безопаснее и проще в использовании.