Array per laufzeit erweitern



  • Morgen zusammen,

    kann ich ein array zur laufzeit erweitern ohne das die Werte verloren gehen?

    also jetzt mal sinnloses beispiel:

    int *test;
    for(int i=0;i<50;i++)
    {
    test = new int[i+1];
    test[i]=i;
    }
    

    würde bzw. könnte man das so machen?

    Danke schonmal



  • Jein. 🙂 Du kannst ein bestehendes Array nicht einfach erweitern, sondern musst ein neues Array mit der neuen Größe erstellen und die alten Werte dort hineinkopieren, das alte Array löschen und abschließend den alten Zeiger den neuen Zeiger zuweisen.

    Einfacher geht so etwas mit std::vector(). Hier wird der Platz automatisch vergrößert, wenn er nicht mehr reicht.



  • Joe_M schrieb:

    Du [...] musst ein neues Array mit der neuen Größe erstellen und die alten Werte dort hineinkopieren, das alte Array löschen und abschließend den alten Zeiger den neuen Zeiger zuweisen.

    Das is ja dann von München über Rom nach Berlin gefahren - erinnert mich an meine Programme 🤡



  • std::vector<int> ist dein Freund...



  • DocShoe schrieb:

    std::vector<int> ist dein Freund...

    Darauf hatte ich in meinem Posting ebenfalls hingewiesen. Nur der Vollständigkeit halber, habe ich den Weg aufgezeigt, ein Array zu vergrößern.



  • JBOpael schrieb:

    Morgen zusammen,

    kann ich ein array zur laufzeit erweitern ohne das die Werte verloren gehen?

    also jetzt mal sinnloses beispiel:

    int *test;
    for(int i=0;i<50;i++)
    {
    test = new int[i+1];
    test[i]=i;
    }
    

    würde bzw. könnte man das so machen?

    Danke schonmal

    Auf keinen Fall macht man das so. Wenn du dir mal genau anguckts, was du da gerade tust, wirst du feststellen, dass du in jedem Schleifendurchlauf ein neues Array erzeugst. Das wirft zwei Probleme auf: 1. Du möchstest bestimmt nur ein Mal ein neues Array erzeugen, dann aber mit der richtigen Größe. 2. Wer gibt das alte Array eigentlich frei? Ich sehe da nirgendwo ein delete[].
    WENN man das so machen würde, dann sollte der Code auch Exception-safe sein und etwa so aussehen:

    int main()
    {
       int* piOldArray = new int[10];
    
       int* piNewArray = new int[20];
    
       std::copy( piNewArray, piNewArray +10, piOldArray );
    
       delete[] piOldArray;
       piOldArray = piNewArray;
    }
    

    PS:
    std::vector<int> ist wirklich dein Freund


Anmelden zum Antworten