none
Länge eines Arrays ermitteln; Zeiger auf ein dynamisches Array RRS feed

  • Frage

  • Hallo liebe Community,

    ich bin relativ neu in C++ und bin gleich auf Zeigerprobleme gestoßen. Meine Idee in Visual Basic: 
    Dim arr[1] As Char
    
    arr[0] = 'a'
    
    ReDim Preserve arr[5]
    
    For i As Integer = LBound(arr, 0) To Ubound(arr, 0)
        arr[i] = CChar(i+65)
    Next
    

    Ich versuche nun dasselbe in C++:
    void PointerAndMemoryBehaviour::makeMemTest() {
        ExpandableObject eo = ExpandableObject();
        ExpandableObject *ptrEO = &eo;
    
        srand(time(NULL));
    
        for (int i = 0; i < 10; i++) {
            std::cout << "Adress: " << ptrEO << " Size: " << sizeof (eo) << "\t[";
    
            eo.expandRandomized();
    
            std::cout << "]\n";
        }
    }
    
    PointerAndMemoryBehaviour::ExpandableObject::ExpandableObject() {
        arrStorage = new char[1];
        arrStorage[0] = 'A';
    
        std::cout << "0: '" << arrStorage[0] << "'\t1: '" << arrStorage[1] << "'\n";
    }
    
    void PointerAndMemoryBehaviour::ExpandableObject::expandRandomized() {
        this->expand((random() % 10) * ((random() % 2) == 0 ? 1 : -1));
    }
    
    PointerAndMemoryBehaviour::ExpandableObject::~ExpandableObject() {
        delete [] arrStorage;
    }
    
    void PointerAndMemoryBehaviour::ExpandableObject::expand(int signed amendment) {
        int intOldarrSize = sizeof (arrStorage) / sizeof (arrStorage[0]);
    
        std::cout << "{";
    
        for (int i = 0; i < intOldarrSize; std::cout << arrStorage[ i++] << (i == intOldarrSize ? "} " : ","));
    
        int intNewArrSize = intOldarrSize + amendment;
    
        if (intNewArrSize < 0) intNewArrSize = 0;
    
        std::cout << "Amendment: " << amendment << " \tOldSize: " << intOldarrSize
                << " \tNewSize: " << intNewArrSize;
    
        if (intNewArrSize != intOldarrSize) {
            delete [] arrStorage;
    
            arrStorage = new char[intNewArrSize];
    
            for (int i = 0; i < intNewArrSize; i++) {
                arrStorage[i] = i + 65;
            }
        }
    }
    nur leider klappt es nicht so, wie ich es will.
    Samstag, 12. Dezember 2009 05:56

Antworten

  • In C/C++ gibt es für "normale" Array-Datentypen (also mit new ...[] allokiert) keine direkte Möglichkeit die Größe zu ermitteln.
    Verwende dazu am besten std::vector<...>
    Jochen Kalmbach (MVP VC++)
    Samstag, 12. Dezember 2009 20:17
  • Das geht aber *nicht* mit *dynamisch* allokiertem Speicher! Sondern nur mit "direktem" z.B: via:

    TCHAR arrStorage[100];
    mit
    TCHAR *arrStorage = new TCHAR[100];
    geht es nicht!

    Ach so: Und schliessen kannst Du wenn Du in meiner Antwort auf "als Antwort markieren" drückst ;)
    Jochen Kalmbach (MVP VC++)
    Samstag, 2. Januar 2010 19:27

Alle Antworten

  • In C/C++ gibt es für "normale" Array-Datentypen (also mit new ...[] allokiert) keine direkte Möglichkeit die Größe zu ermitteln.
    Verwende dazu am besten std::vector<...>
    Jochen Kalmbach (MVP VC++)
    Samstag, 12. Dezember 2009 20:17
  • Lösungen mit der Standard Template Library

    Wie Jochaen Kalmbach bereits erwähnte, existieren in der STL die Klassen std::vector und std::valarray. Beide verhalten sich wie ein Array und bieten die Methode "size()", welche die Größe des "Arrays" zurückgeben.

    Möglichkeit der Größenbestimmung von char Arrays.

    In char Arrays werden meistens Zeichenketten gespeichert. Diese werden in den meisten Fällen automatisch mit einem '\0' Zeichen beendet, welches das Ende der Zeichenkette festlegt.

    Du kannst in einer Schleife diverse Felder des Arrays durchlaufen und alle Felder bis zum \0 Zeichen zählen.



    Viele Bilbiotheken und WINAPI Funktionen fordern neben dem Zeiger auf das Arrays noch eine Variable vom Typen DWORD, int oder size_t, welche direkt bei der dynamischen Allokation auf die Größe des Arrays gesetzt werden.
    Diese Lösung ist allerdings nur realisierbar, wenn der Zeiger, von welchem du die Größe zu ermitteln versuchst, nicht aus einer 3rd Party Bibliothek stammt.
    Mittwoch, 16. Dezember 2009 17:56
  • Sehr geehrter Herr Kalmbach,

    vielen Dank für die Antwort. Diverse C++ Bücher haben

    sizeof (arrStorage) / sizeof (arrStorage[0])

    als DIE Lösung propagiert. Wie ich befürchtet habe ist Ihre Antwort wahr.

    Danke für die Klarstellung.

    Wenn ich jetzt noch wüsste, wie ich den Thread hier schließen kann, würde ich es machen.

    Samstag, 2. Januar 2010 18:54
  • Das geht aber *nicht* mit *dynamisch* allokiertem Speicher! Sondern nur mit "direktem" z.B: via:

    TCHAR arrStorage[100];
    mit
    TCHAR *arrStorage = new TCHAR[100];
    geht es nicht!

    Ach so: Und schliessen kannst Du wenn Du in meiner Antwort auf "als Antwort markieren" drückst ;)
    Jochen Kalmbach (MVP VC++)
    Samstag, 2. Januar 2010 19:27