Для динамічних масивів ( 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;
}
Ви можете в google з причин насторожено ставитися до таких макросів. Будь обережний.
Якщо це можливо, C ++ stdlib, такий як вектор, який набагато безпечніший і простіший у використанні.