Für dynamische Arrays ( malloc oder C ++ new ) müssen Sie die Größe des Arrays wie von anderen erwähnt speichern oder eine Array-Manager-Struktur erstellen, die das Hinzufügen, Entfernen, Zählen usw. handhabt. Leider macht C dies bei weitem nicht so gut wie C ++, da Sie es grundsätzlich für jeden unterschiedlichen Array-Typ erstellen müssen, den Sie speichern. Dies ist umständlich, wenn Sie mehrere Arten von Arrays verwalten müssen.
Für statische Arrays, wie das in Ihrem Beispiel, wird ein allgemeines Makro verwendet, um die Größe zu ermitteln. Es wird jedoch nicht empfohlen, da nicht überprüft wird, ob der Parameter wirklich ein statisches Array ist. Das Makro wird jedoch in echtem Code verwendet, z. B. in den Linux-Kernel-Headern, obwohl es sich geringfügig von dem folgenden unterscheiden kann:
#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;
}
Sie können aus Gründen googeln, um sich vor solchen Makros in Acht zu nehmen. Achtung.
Wenn möglich, die C ++ stdlib wie Vektor, die viel sicherer und einfacher zu bedienen ist.