Zurückgeben eines Pointers auf ein automatisches Objekt sicher?
-
Hallo,
ist folgendes sicher?
int *foo() { int bar=3; int *p=&b; return p; } int main() { int *i; int j; i=foo(); j=&i; // Blablabla return 0; }
Wenn foo verlassen wird, wird der Speicher von bar deallokiert, aber nicht vernichtet. Besteht ein Risiko, wenn ich die Adresse benutze, bevor ich eine andere Funktion aufrufe oder ein Objekt definiere?
Danke für eure Antworten.
[EDIT] Mir ist schon klar, dass das kein sauberes Programmieren ist, aber ich will wissen, was passiert, wenn ich en oben beschriebenen Fehler begehen (und, mal ehrlich: Wer hat es nicht schon mal gemacht)? [/EDIT]
-
Also ich nehme mal an, das soll int* p = &bar heißen.
Sicher ist das allein schon deshalb nicht, weil das Verhalten undefiniert ist. Vermutlich bleibt der Wert der selbe, wenn du direkt nach der Rückkehr von der Funktion ihn nochmal ausliest.
Aber wehe, du rufst noch ne weitere Funktion auf. Oder wehe, du änderst später mal irgendwas anderes und denkst nicht mehr an deinen kleinen Hack.
Außerdem hat es doch keinerlei Nutzen. Für so etwas gibt es Rückgabewerte und Übergabe als Zeiger/Referenz.
-
CME386 schrieb:
Wenn foo verlassen wird, wird der Speicher von bar deallokiert, aber nicht vernichtet.
Puh ... RAM ist zwar billig, aber auch nicht so, dass bei jedem Funktionsaufruf einige Zellen in Rauch aufgehen können
(und, mal ehrlich: Wer hat es nicht schon mal gemacht)
Jedenfalls nicht mit Absicht.
-
@Bashar: Ich hatte das jetzt so gemeint, dass der Inhalt nicht vernichtet wird.
Mir ist schon klar, dass das keiner mit Absicht macht, aber es kommt manchmal vor (wenn auch selten). Ich weiß auch, dass es keinen Nutzen gibt und ich will nicht absichtlich so programmieren. Es ist bloße Neugier, sonst nichts.