int feld aus funktion zurückgeben
-
hallo ich habe da ein problem bei dem nachfolgenden kleinen programm
*int funktion()
{
int y[5]={1,5,3,4,9};
return *y;
}int main()
{
int z[5];
*z=funktion();
cout << z[0]<<endl;
cout << z[1]<<endl;
cout << z[2]<<endl;
cout << z[3]<<endl;
cout << z[4]<<endl;
getchar();
return 0;
}*Dieses Programm bringt mir als Ausgabe:
1
844813368
1
256
1Es soll aber diese Ausgabe bringen:
1
5
3
4
9Kann mir jemand sagen, was da mit der Rückgabe des Feldes nicht stimmt, oder was da falsch ist.
-
1. Du gibst kein int* zurück sondern einen int
2. Du gibst *y als Return-Wert zurückint function () { int y [5] = {1,5,3,4,9}; return *y; // y ist ein Zeiger auf das erste Element des Arrays (y[0]), dereferenzierung liefert also 1 -> du gibst 1 zurück, nicht mehr und nicht weniger } ... int z [5]; // Du legst ein Array von 5 Elementen an die nicht initialisiert sind *z = funktion(); // Du initialisierst das erste Element mit dem Rückgabewert von funktion() -> in unserem Fall immer 1 ... // Ausgabe // Ergibt immer: 1, Zufällig, Zufällig, Zufällig, Zufällig // Da du nur das erste Element initialisiert hast.
=> Du musst ein ganzes Feld zurückgeben und nicht nur einen Wert. Das Problem an Feldern ist aber, dass (fast) immer nur ein Zeiger auf das erste Element vorhanden ist. Wenn du den nun zurückgibst (Rückgabetyp: int*) dann hast du kein neues Element sondern gibst eben einen Zeiger auf den selben Speicher wie in der Funktion zurück. Das Problem ist nun, dass der Speicher der lokalen Variable (Das Array y) beim Beenden der Funktion gelöscht wird. Dein Zeiger würde also wenn du es richtig geschrieben hast ins leere Zeigen und würde einen Programmabsturz zur Folge haben (im besten Fall).
Möglichkeit 1: Du übergibst das Feld (wieder mal per Zeiger, eine Kopie des Speichers wird nicht gemacht) und schreibst in den Speicher:
void funktion (int* z) { z[0] = 1; z[1] = 5; z[2] = 3; z[3] = 4; z[4] = 9; } int main () { int z [5]; funktion(z); // Ausgabe return 0; }
Möglichkeit 2: Du arbeitest mit der Standardklasse vector, sie repräsentiert mehr oder weniger ein dynamisches Array und da es selbst ein Objekt ist und kein Feld wird es auch kopiert (Das in der Klasse ebenfalls mit einem Feld gearbeitet wird, muss dich nicht interessieren):
#include <vector> using namespace std; vector<int> funktion () { vector<int> y; y.resize(5); y[0] = 1; y[1] = 5; y[2] = 3; y[3] = 4; y[4] = 9; return y; } int main () { vector<int> z = funktion(); // Ausgabe return 0; }
Wenn du noch Fragen hast (gut möglich) poste einfach nochmals
MfG SideWinder
-
jo danke, das geht erst mal