Anzahl eines arrays in c++ ermitteln?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

De sauberste Lösung ab C++17 sähe so aus:

constexpr auto len { 5ul };
int arr[len] {};

Die zweitsauberste Lösung, die man oft verwendet, wenn man mit Templates hantiert, geht so:

#include <type_traits> // extent

// ...

int arr[5] {};

using namespace ::std;
cout << extent<decltype(arr)>() << endl;

Die uralte C-Lösung, die heute auch noch oft verwendet wird, sieht so aus:

int arr[5] {};
cout << (sizeof(arr) / sizeof(*arr)) << endl;

Das ist natürlich völlig OK, wenn du in C programmierst, aber fehleranfällig, weshalb du bei C++ ::std::extent nehmen solltest. Das hat den Vorteil, dass du eine schöne Fehlermeldung bekommst, falls der Typ nicht stimmt.

Alles in allem solltest du bei C++ grundsätzlich auf - oft einfacher wirkende - Herangehensweisen aus C verzichten, weil C an einfach zu vielen Stellen quasi keine Typsicherheit kennt. (void-Zeiger, Format-Strings, Varargs, Preprozessor-Magie, uvm.)

Von daher: Gewöhne dir die Nutzung von extent an ... und nebenbei auch allen anderen Dingen, die du im <type_traits> Header findest. (Da dich das momentan aber alles noch überfordern würde, lerne erst mal die Grundlagen fertig und guck dir das genanannte in einem halben Jahr ruhig mal an!)

Viel Spaß! :)

Woher ich das weiß:Berufserfahrung

Pilsvergiftung  02.05.2020, 04:48

Nachtrag: Die allersauberste Lösung wäre natürlich <array> zu ntzen:

#include <array>

// ...

::std::array<int, 5> arr {};

cout << arr.size() << endl;

Da man in modernem C++ sowieso keine "nackten" Arrays mehr nutzen sollte, ist <array> grundsätzlich zu bevorzugen. Das hat neben Typsicherheit nur Vorteile. Zum Beispiel "kennt" ein solches Array immer seine eigene Größe und hat dabei keinen zusätzlichen Laufzeitoverhead.

Ich hatte das in meiner Antwort erst nicht erwähnt, weil ich dich nicht mit den vielen Möglichkeiten erschlagen wollte, aber jetzt denke ich mir, dass du wenigstens mal davon gehört haben solltest.

Herkömmliche C-artige Arrays werden oft implizit zu Zeigern "degradiert", wenn sie an Funktionen übergeben werden, wodurch sie das Wissen über ihre eigene Größe verlieren.

Und leider liest man immer noch oft, dass Zeiger und Arrays fast das gleiche sind, was noch nie gestimmt hat, aber so oft wiederholt wurde, dass es viele Entwickler tatsächlich glauben.

Bei zum Beispiel ...

int arr[5] {};

... gehört die 5 zum Typen von "arr" und diese Tatsäche ist vielen Entwicklern tatsächlich gar nicht bewusst.

Aber egal. Falls du irgendwann mal die Grundlagen hinter dir gelassen hast, merke dir einfach, dass es <array> für Stellen gibt, an denen du herkömmliche Arrays nutzen würdest, und extent() kannst du bei Legacy-Code nutzen.

1

Gar nicht. Zumindest nicht sinnvoll.

Im besten Fall könnte das funktionieren, sofern du das Array nicht an eine andere Funktion übergeben oder ähnliches tun willst:

int deinArray[5];
std::cout << "Bis zu " << (sizeof(deinArray)/sizeof(int)) << " Elemente." << std::endl;

Ansonsten wäre es für C++ allerdings sinnvoller eine Klasse wie std::vector bzw. std::array zu verwenden.