Anzahl der Elemente mittels sizeof() ermitteln;



  • Hallo!

    Ich habe einen 2-dimensionalen dynamischen Pointer-Array, der auf Strings zeigt und dessen Anzahl der Elemente ich erst zur Laufzeit in einem Klassenkonstruktor zuweise.

    Später hole ich mir die Anzahl der Elemente, also die Größe des Pointerarrays mit sizeof(ptrArray) und leider gibt mir der compiler einen falschen Wert zurück.
    Egal welche Größe ich im Konstruktor vorgebe, bei der Rückgabe kommt immer die 4 als Anzahl zurück.

    hier mal mein konstruktor:

    tbClass::tbClass(int X, int Y)
    {
    	tb=new string *[X];
    	for (int i = 0; i < X ; i++) 
                 tb[i] = new string[Y];
    
             cout<<sizeof(tb);  //Ergebnis: 4 ???
    }
    

    und die Definition von tb:

    class tbClass
    { 
       std::string** tb;
    //   (...)
    public: 
       tbClass(int X, int Y);
    }
    

    wenn ich jetzt eine Instanz von dieser Klasse anlege, mit X=10 und Y=10 dann bekomme ich von sizeof(tb) leider immer 4
    habe ich da vielleicht was übersehen?

    Bitte um Hilfe; bedanke mich im Voraus für euer Bemühen.

    liebe Grüße, Su Chen



  • tb ist ein Zeiger, ein Zeiger ist auf einem 32-Bit System (idR.) 4 Bytes (32-Bit) breit. Somit liefert sizeof( tb ) - völlig zurecht - 4.
    Warum merkst du dir X und Y nicht einfach?

    Greetz, Swordfish



  • ⚠ hmm... ich hab das Folgende gefunden:

    Mit dem sizeof-Operator angewandt auf einen Zeiger, der auf ein dynamisch erstelltes Array zeigt, kann man nicht die Anzahl der Komponenten des Arrays feststellen!
    aus: Speicherplatz reservieren und verändern in C++

    gibts da vielleicht eine andere möglichkeit die Anzahl der Elemente zu bekommen?



  • Swordfish schrieb:

    Warum merkst du dir X und Y nicht einfach?



  • oh .. hehe.. war etwas langsam beim Schreiben...

    ok.. aber ich würde trotzdem gerne wissen, ob es keine andere funktion gibt die die funktion von sizeof übernimmt ^^

    aber danke für den tipp 🙂



  • Lösungsmöglichkeit für echte Masochisten:

    Du könntest für dich festlegen, dass im c-tor jeder Pointer deines Arrays einen Wert ungleich 0 (null) bekommt - bis auf den letzten. Dann kannst du bei Bedarf immer wieder lustig Zählen, darfst jedoch den letzten Pointer logischerweise nicht verwenden.

    Greetz, Swordfish



  • Es gibt so etwas nicht. Du kannst es, wenn du die Implementierung von new[] kennst selber bauen (s.u.), aber da das bei jedem Compilerhersteller unterschiedlich sein kann, wärst du dann an einen Compiler gebunden, ist also keine gute Idee.

    Ein Beispiel:
    Der Compiler könnte die Länge des Arrays in einem size_t-Bereich vor den eigentlichen Daten speichern (er brauch sie ja schließlich selber für den delete[]-Aufruf):

    template <typename T>
    size_t heap_sizeof_array (T* p)
    {
        return *(--reinterpret_cast<size_t*> (p));
    }
    

    Aber wie gesagt, benutz das nicht, es ist nur ein Beispiel.



  • .filmor schrieb:

    Der Compiler könnte die Länge des Arrays in einem size_t-Bereich vor den eigentlichen Daten speichern (er brauch sie ja schließlich selber für den delete[]-Aufruf)

    Nö braucht er nicht, und schon gar nicht der Compiler. Wenn dann erledigt das die Bibliothek. Und diese Implementation wiederum ist vom Betriebssystem abhängig da so etwas vom Speichermanagement des Betriebssystems erledigt wird. Von daher ist das an und für sich Quark.

    BR
    Vinzenz



  • evilissimo schrieb:

    und schon gar nicht der Compiler. Wenn dann erledigt das die Bibliothek.

    Hast Recht, eine kleine Unachtsamkeit in der Wortwahl 😉

    evilissimo schrieb:

    Und diese Implementation wiederum ist vom Betriebssystem abhängig da so etwas vom Speichermanagement des Betriebssystems erledigt wird.

    Hmm, wenn das alles das Betriebsystem übernimmt, wieso brauch man dann zwei delete Varianten?! Das OS weiß doch gar nichts davon, ob das nun ein Array oder ein riesiges Objekt ist.



  • Wegen der Destruktoren (die müssen ja aufgerufen werden). Stimmt und genau deshalb muss die Bibliothek bei einem Array wissen wieviel Elemente es hat.

    Tja nobody is perfekt 😉 Alles weiß ich nun auch nicht 😛

    BR
    Vinzenz



  • whou.. danke für die zahlreichen tipps

    bin aber kein masochist :p

    lg Su Chen



  • Versuch's mal mit einem std::vector<std::vectorstd::string >. Damit kannst du die Göße per size() herraus finden.

    mfg.



  • hmm.. das ist eine gute Idee!

    habs auch schon damit gemacht 😉

    danke sehr 😃 👍


Anmelden zum Antworten