[Anfänger] Returnwert einer Funktion... (lokale Var.)



  • Hallo,
    Hab ne bestimmt total simple Frage (für nicht anfänger)
    Ich habe eine Funktion die einen Zeiger auf eine RECT-Strukur zurückgibt.
    Diese Variable habe ich in der Funktion ganz einfach mit:

    RECT myrect;
    

    initialisiert.
    Jetzt geb' ich einen Zeiger auf diese Variable zurück...

    Wie ich das bis dato verstanden habe, ist diese Variable doch aber
    lokal. Also eigentlich dürfte die sich doch erschießen, wenn die Funktion
    beendet ist ?
    Oder ist das bei Return-Werten anders ?

    Und wie lang ist diese Variable dann noch im Speicher?

    Gruss & wär nett, wenn jmd. mir nen Geistesblitz schenkt 😉
    Thommy



  • ThommyLee schrieb:

    Wie ich das bis dato verstanden habe, ist diese Variable doch aber
    lokal.

    Korrekt.

    Also eigentlich dürfte die sich doch erschießen, wenn die Funktion
    beendet ist?

    Vielleicht etwas gewaltverherrlichend, aber so könnte man es ausdrücken.

    Oder ist das bei Return-Werten anders ?

    Nein. Wenn du ein Zeiger auf ein lokales Objekt aus einer Funktion zurückgibst, dann führt jeder Zugriff auf dieses Objekt über diesen Zeiger zu undefiniertem Verhalten, da das Objekt nach Beendigung der Funktion nicht mehr existiert.
    Du stocherst dann quasi in einer Leiche rum. Nicht schön.



  • dank dir! 🙂
    *grins* wenn ich gewaltverherrlichend bin, dann bist du aber makaber 😉



  • Gute Frage...
    und wie ist es wenn man einen int oder so zurückgibt ?
    (also keinen Zeiger)



  • MarkusS schrieb:

    Gute Frage...
    und wie ist es wenn man einen int oder so zurückgibt ?
    (also keinen Zeiger)

    In diesem Fall lieferst du nur den *Wert* des lokalen ints nicht den int selbst. Der Aufrufer erhält eine Kopie, welche den selben Wert hat. Das lokale int-Objekt stirbt zwar, dass ist für den Aufrufer aber irrelevant, da er ein eigenes int-Objekt bekommen hat.

    Prinzipiell musst du zwischen "return-by-value" und "return-by-reference" unterscheiden. Ersteres liefert immer eine Kopie, desahlb kann hier auch ein lokales Objekt im return-Statement auftauchen. Letzteres liefert eine Referenz auf ein vorhandenes Objekt. Dieses Objekt sollte tunlichst länger leben als die Referenz. Ansonsten ist der Zugriff über diese Referenz ein Fehler.
    (unnötiges Detail am Rande: Strenggenommen ist ein Zeiger-Rückgabe auch immer "return-by-value", da der Zeiger dabei kopiert wird. Die Semantik ist aber "return-by-reference", da das hinter dem Zeiger liegende Objekt nicht kopiert wird und dieses ist es ja, an dem der Aufrufer interessiert ist)


Anmelden zum Antworten