Länge char*-Array -- NULL-Test ausserhalb Array-Grenzen valides C++ ?
-
Hallo,
ein Char*-Array wie folgt initialisert:
char * arr[] = { "eins", "zwei", "drei" };Wie bekommt man die Anzahl der Elemente (3) heraus ?
Als Behelfslösung hab ich gefunden:
for(arrsize=0; arrsize[i] != NULL; ++arrsize);Mal abgesehen von der Frage, ob es keine bessere Lösung zur
Ermittlung der Elementeanzahl eines solchen char*-Arrays gibt,
wäre die zweite Frage, ob der Nulltest ausserhalb Array-Grenzenarr[greaterArrayLength] != NULLeigentlich valider C++-Code ist und überall läuft.
Danke und Gruß
Tomax
-
Benutze std::vectorstd::string oder meinetwegen eine array Implementierung (boost::array oder std::tr1::array)
-
An der Stelle, wo du das Array direkt in der Hand hast, kannst du mit sizeof die Größe ermitteln:
int arrsize = sizeof(arr)/sizeof(arr[0]);. Das funktioniert allerdings nicht mehr, wenn du nur noch einen Zeiger auf den Array-Anfang in der Hand hältst (z.B. weil du dieses Array als Parameter übergeben bekommen hast).
-
danke für die Tips.
Aber trotzdem würde mich noch interessieren, ob
arr[greaterArrayLength] != NULLvalider C++-Code ist oder das Ergebnis
davon abhängt, was zufällig an Stelle sowieso
im Speicher steht.
Weiss das jemand ?
-
Nein, das ist kein valider Code - deine Variablen liegen relativ dicht hintereinander auf dem Stack (die genaue Anordnung dürfte vom Compiler abhängen) und wenn du versuchst, über die Array-Grenzen hinaus zu lesen (oder gar zu schreiben), hantierst du mit dem Inhalt der benachbarten Variablen.
(Wenn du weit genug gehst, kannst du sogar die interne Programmstruktur zerstören, indem du die Rücksprungadresse der aktuellen Funktion überschreibst)
-
tomax schrieb:
ein Char*-Array wie folgt initialisert:
char * arr[] = { "eins", "zwei", "drei" };Wie bekommt man die Anzahl der Elemente (3) heraus ?
sizeof(arr)/sizeof(arr[0])
-
Für den Elementtyp des Arrays würde ich ausserdem
const char*stattchar*nehmen, damit verhinderst du nämlich undefinierten Schreibzugriff auf die Stringliterale.
-
Statt
sizeof(arr) / sizeof(arr[0]);halte ich
template<typename T, std::size_t N> std::size_t array_size(T(&)[N]) { return N; } // und dann später array_size(arr);für sinnvoller. Auf die Art beschwert sich der Compiler, wenn man einen Zeiger statt eines Arrays hineinstopft.
Ansonsten kann ich theta und Nexus nur zustimmen.
-
In C ist es gängige Praxis, das so zu schreiben
char * arr[] = { "eins", "zwei", "drei" , NULL };Dann funktioniert der Test. In C++ würde ich aber auch vector<string> nehmen.
-
glaub, mir ist geholfen. Thx für die Antworten.