Para matrizes dinâmicas ( malloc ou C ++ novo ), é necessário armazenar o tamanho da matriz como mencionado por outros ou talvez criar uma estrutura de gerenciador de matriz que lide com adicionar, remover, contar etc. Infelizmente, C não faz isso tão bem quanto C ++, já que você basicamente precisa criá-lo para cada tipo de matriz diferente que você está armazenando, o que é complicado se você tiver vários tipos de matrizes que precisa gerenciar.
Para matrizes estáticas, como a do seu exemplo, existe uma macro comum usada para obter o tamanho, mas isso não é recomendado , pois não verifica se o parâmetro é realmente uma matriz estática. A macro é usada no código real, por exemplo, nos cabeçalhos do kernel do Linux, embora possa ser um pouco diferente da abaixo:
#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;
}
Você pode pesquisar no Google por motivos de desconfiança em relação a macros como essa. Seja cuidadoso.
Se possível, o stdlib do C ++, como vetor, é muito mais seguro e fácil de usar.