Gültigkeit von Variablen
-
Hoi,
Ich habe eine kleine Frage zut gültigkeit von Variablen in Funktionen.
func1(char* word) { cout << word; } func2() { char* word="Hallo"; func1(word); }In Funktion 2 habe ich die Variable word.
Wie lange existiert diese?Existiert sie bis die Funtkion per return verlassen wird?
oder
Existiert bis eine andere Funktion wie in meinen Beispiel angesprungen wird??
-
Du kannst innerhalb von func2() immer noch auf sie zugreifen nach dem Aufruf von func1(), nur außerhalb von func2() halt nicht ... ja also, wenn du so willst bis zur return-Anweisung
was meinst du mit existiert? auf dem Speicher vorhanden ist?
-
Ersteres. Sie existiert aber auch nur innerhalb der Funktion, kannst also in func2() nicht auf sie zugreifen.
-
Ich meine im Speicher vorhanden, sodass ich mit pointern auf sie zugreifen kann.
-
Solange du nicht den Gülltigkeitsbereich (sprich den Bereich der geschweiften Klammern, in denen du die lokale Variable definierst) verlässt, ist die Variable auch im Speicher vorhanden. Danach ist nichts mehr garantiert...
-
Hi Tuffly ,
ich vermute, die Schwierigkeit liegt darin, dass Du "nicht hierarchisch denkst":
Wenn Du von func2() aus func1() aufrufst, bleibst Du im scope von func2() !
Deswegen kann func1() in dem Fall erfolgreich (vermittelt durch den Zeiger "word") auf den Speicher zugreifen, in den Du "Hallo" geschrieben hast.Wenn Du func1() von woanders heraus aufrufst, wird "word" woanders hinzeigen ... und selbst wenn Du ihn auf dieselbe Speicheradresse biegst (was problemlos geht), würde er auf ein ungültiges Objekt verweisen.
Noch 2 "Anfänger-Aspekte" (die Du vielleicht schon kennst - aber vielleicht auch nicht):
- "word in func1()" ist als Variable unabhängig von "word in func2()"; benenne mal eine von beiden um: Es wird weiterhin funktionieren; beim Aufruf von func1() wird der Inhalt von "func2_word" (Inhalt ist Adresse von "Hallo") in "func1_word" kopiert.
- Da "Hallo" ein "Stringliteral" ist (also zur Compilezeit festelegter und initialisierter Speicherbereich), darf man in ihn nicht hineinschreiben. Hier solltest Du mit "const-correctness" arbeiten - immerhin sollten func1() und func2() wissen, dass sie da nicht reinschreiben dürfen. (Mich überrascht, dass es dabei keine compilerwarning gibt)...
Gruß,
Simon2.