Pointer aus Funktion, dynamisch
-
Hallo!
Zunächst mal habe ich jetzt eine gute Stunde gesurft, aber nichts passendes gefunden, hoffe Ihr könnt mir helfen.
Und zwar habe ich ein Programm geschrieben, dass soweit funktioniert.
Also eine Funktion mit int* in der Funktion ein dynamisches array erzeugt;
dieses dann befüllt; wenn ich es mir ausgeben lasse(in der Funktion), passt alles;
Mein Problem ist: wenn ich dass dynamisch erzeugte Array an die Main funktion retouniere, fange ich es folgendermaßen auf:
int *s = fkt(übergeben Parameter);
passt auch alles;
NUR sobald ich cout << *s; schreibe verändern sich alle Werte nichts stimmt mehr;
als Bsp: Am Anfang bestimme ich die Länge des arrays (integer!) ok Länge 10;
sobald ich weiter unten eben dieses cout << *s; schreibe auf einmal stimmt nicht mal mehr die Länge gar nichts mehr?!;
Danke für die Hilfe!int arr[] = {1,2,5,7,4,9,2,4,3,1}; int laenge=0; for (;arr[laenge];laenge++); cout << laenge << endl; int kopie=laenge; int *s = gerade(arr,laenge,kopie); cout << "Neue Länge: " << kopie << endl; // cout << *s << " "; // delete s;mfg
-
Die Schleife im Code ist aequivalent zu
for (; arr[laenge] != 0 ;laenge++); cout << laenge << endl;Und erzeugt undefiniertes Verhalten.
Was du eigentlich willst, istint laenge = sizeof(arr)/sizeof(*arr);int kopie=laenge; int *s = gerade(arr,laenge,kopie);Wozu die "Kopie"? Ist der dritte Parameter eine Referenz?
-
Alles wegwerfen, stattdessen std::vector oder ähnliche Container nutzen? Das was du jetzt versuchst ist doch nur eine ziemlich schlechte Kopie dieser Klassen aus der Standardbibliothek.
-
Arcoth_logoff schrieb:
Und erzeugt undefiniertes Verhalten.
Was du eigentlich willst, istint laenge = sizeof(arr)/sizeof(*arr);Nein, das will er auch nicht, denn es wird nicht klappen.
Entweder std::vector oder wenn nicht, dann std::array
-
Hi, danke für die schnelle Antworten.
Leider darf ich solche vordefinierten Klassen nicht verwenden;
Mein Problem liegt darin, dass sobald ich, das cout *s ausgebe bekomme ich die falsche Länge und somit ist alles in der Funktion auch falsch. ja dritter Parameter ist eine Referenz;
ich verstehe nicht wie sich das cout statement darauf auswirkt, dass die Länge falsch bestimmt wird;
-
Wenn ich die Länge bestimme, so wie ich es gemacht habe bekomme ich Länge 10;
Sobald ich unten cout << *s schreibe, gibt er mir oben als Länge 11 aus, wieso?;
-
Deine for-Schleife ermittelt nicht die Länge von arr, sondern zählt so lange, bis sie eine Null auf dem Stack findet oder das Programm von der Runtime abgeschossen wird. Im einen Fall liegt zufällig eine Null(länge?) vor arr, im anderen eben nicht.
-
Ja hast Recht achhh danke

-
Aber etwas verwirren tuts mich trotzdem, dass nur durch ein cout statement der stack so verändert wird?
-
c++_) schrieb:
Aber etwas verwirren tuts mich trotzdem, dass nur durch ein cout statement der stack so verändert wird?
Was heißt hier nur? Das ist ein normaler Funktionsaufruf und wenn du den ganzen Code hinter so einer Bildschirmausgabe selbst schreiben müsstest, dann wärst du Monate, eher Jahre beschäftigt. Selbst wenn man dir freundlicherweise das Schreiben von involvierter Firmware und Gerätetreiber erlassen würde.