W przypadku tablic dynamicznych ( malloc lub C ++ nowy ) musisz przechowywać rozmiar tablicy, jak wspomniano przez innych, lub być może zbudować strukturę menedżera tablic, która obsługuje dodawanie, usuwanie, liczenie itp. Niestety C nie robi tego prawie tak dobrze, jak C ++, ponieważ zasadniczo musisz go zbudować dla każdego rodzaju przechowywanego typu tablicy, co jest uciążliwe, jeśli masz wiele typów tablic, którymi musisz zarządzać.
W przypadku tablic statycznych, takich jak ten w twoim przykładzie, do uzyskania rozmiaru używa się wspólnego makra, ale nie jest to zalecane, ponieważ nie sprawdza, czy parametr jest rzeczywiście tablicą statyczną. Makro jest używane w prawdziwym kodzie, np. W nagłówkach jądra Linuksa, chociaż może się nieco różnić od poniższego:
#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;
}
Możesz wyszukiwać w Google z powodów, aby uważać na takie makra. Bądź ostrożny.
Jeśli to możliwe, stdlib C ++, taki jak wektor, jest znacznie bezpieczniejszy i łatwiejszy w użyciu.