Zeigerproblem



  • Ich will in einer Funktion einen Array neu demensionieren.
    Das sieht dann so aus:

    int newdem(unsigned long *arr)
    {
    	arr=new unsigned long[2];
    	arr[0]=0;
    	arr[1]=1;
    
    	return 1; //alles O.K.
    }
    

    Wenn ich aber jetzt die funktion in main aufrufe und debugge

    unsigned long *ad;
    newdem(ad);
    

    Dann heißts nach der Funktion im Debugfenster leider für ad nur
    "Wert konnte nicht gelesen werden" 😕
    Was mach ich falsch ????
    PS: Die Adresse auf die ad verweißt ist unterschiedlich zu der von arr in der Funktion,dabei wird doch eigentlich beim funktionsaufruf arr der Wert von ad übergeben ?



  • Als erstes, wird beim Aufruf deiner Funktion eine Kopie des übergebenen Feldes Erzeugt und nur diese Kopie verändert.

    int newdem(unsigned long &arr)
    

    Sollte der richtige Funktionskopf sein.

    Dann gibt es da noch das Problem, daß wenn du die Größe des Feldes ändern willst, du es erst noch kopieren musst.

    /*EDIT*/
    @Shade Of Mine
    Danke für die Berichtigung



  • daishi schrieb:

    int newdem(unsigned long &arr)
    

    Achtung: Tippfehler!

    int newdem(unsigned long*& arr)
    


  • jetzt hab ichs rausgekriegt:

    Hier bekommt arr eine neue Adresse:

    arr=new unsigned long[2];

    Wie könnte ich das jetzt umgehen damit ad dann die länge 2 hat ???



  • arr bekommt keine neue Adresse, arr zeigt auf eine neue Adresse. Und da arr eine lokale Variable (ein normaler Parameter) ist, merkt ad nichts davon. Wie Shade geschrieben hat, musst du ad per Referenz (&) übergeben.
    Außerdem weise ich dich der Vollständigkeit halber nochmal darauf hin, dass man mit einem std::vector nicht so oft stolpert 😉

    Und es heißt "Dimension" und "dimensionieren" 🙄



  • Könntest's auch so machen:

    unsigned long *newdem()
    {
    	arr=new unsigned long[2];
    	arr[0]=0;
    	arr[1]=1;
    
    	return arr;
    }
    
    unsigned long *ad;
    ad = newdem();
    

    Allerdings sollte man das "delete" dem Aufrufer nicht überlassen (vergißt man leicht und hat dann Memory-Leaks), sondern lieber auto_ptr benutzen, wenn's denn wirklich nötig ist, in einer Funktion dynamisch allokierten Speicher zurückzugeben.



  • auto_ptr kann man hier leider nicht verwenden, weil der Speicher über delete[] gelöscht werden muss. Da hilft entweder ein auto_array (ich glaube, so etwas gibt es in Boost) oder eben ein std::vector.


Anmelden zum Antworten