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-Grenzen

    arr[greaterArrayLength] != NULL
    

    eigentlich 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] != NULL
    

    valider 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* statt char* 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.


Anmelden zum Antworten