lokale Variablen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • lokale Variablen

    Hi Leute ich habe volgendes Problem:

    Lokale Variablen sollten ja unabhängig von einander agieren. Ich verstehe also nicht wieso als Ausgabe "Dort ist der Wert von v 35" raus kommt. Auch wenn ich für die Variable v(void dort Funktion) eine anderen variablen Namen nehme wie zb. "k" bekomm ich die gleiche Ausgabe und zwar "Dort ist der Wert von k 35".

    Kann mir wer helfen?



    Quellcode

    1. #include <stdio.h>
    2. void hier(void);
    3. void dort(void);
    4. int main()
    5. {
    6. hier();
    7. dort();
    8. system("PAUSE");
    9. return 0;
    10. }
    11. void hier()
    12. {
    13. int v;
    14. v=6*5;
    15. printf("Hier ist der Wert von v %i\n\n", v);
    16. }
    17. void dort()
    18. {
    19. int v;
    20. v+=5;
    21. printf("Dort ist der Wert von v %i\n\n", v);
    22. }
    Alles anzeigen
  • Das Phänomen hat wenig damit zu tun wie die variablen heißen, die du benutzt (das hast du ja selber festgestellt). Das Problem ist, dass du die Variablen nicht initialisierst. Nichtinitialisierte Variablen haben keinen definierten Wert, dieser kann alles mögliche sein, je nachdem was an der Stelle im Speicher steht, an der jetzt die Variable liegt.

    Lokale Variablen liegen auf dem Stack (de.wikipedia.org/wiki/Stapelspeicher#Mikroprozessoren). Jedesmal wenn eine Funktion aufgerufen wird, wird ein neuer Bereich für diese oben auf dem Stack angefangen und sobald das Programm die Funktion verlassen hat wird der Speicher wieder freigegeben.
    D.h. wenn du in die Funktion hier() reingehst wird oben auf dem Stack die Variable v abgelegt und ihr der Wert 30 gegeben. Dann ist die Funktion zuende und der Speicher auf dem Stack freigegeben. Wenn du jetzt dort() aufrufst, befindet diese Methode sich im gleichen Bereich auf dem Stack wie eben hier() und wenn du jetzt ein neues v auf den Stack legst, liegt es exakt an der gleichen Stelle wie das alte v. Und da diese Speicherstelle bei der Deklaration der Variablen nicht überschrieben wird, steht da halt immernoch die 30 drin, und wenn du mit v weiterrechnest benutzt er diese 30.

    Wenn du jetzt z.B. sowas machst, wird etwas völlig anderes passieren, weil hier jetzt k an der Stelle des alten v liegt:

    Quellcode

    1. #include <stdio.h>
    2. void hier(void);
    3. void dort(void);
    4. int main()
    5. {
    6. hier();
    7. dort();
    8. system("PAUSE");
    9. return 0;
    10. }
    11. void hier()
    12. {
    13. int v;
    14. v=6*5;
    15. printf("Hier ist der Wert von v %i\n\n", v);
    16. }
    17. void dort()
    18. {
    19. int k;
    20. int v;
    21. v+=5;
    22. k=0;
    23. printf("Dort ist der Wert von v %i\n\n", v);
    24. }
    Alles anzeigen

    (das k=0 hab ich nur rein, weil er mir ansonsten die Variable k komplett wegoptimiert hat)


    Und wenn du die Funktionen nicht nacheinander, sondern verschachtelt aufrufst, wird auch ein anderes Ergebnis rauskommen:

    Quellcode

    1. #include <stdio.h>
    2. void hier(void);
    3. void dort(void);
    4. int main()
    5. {
    6. hier();
    7. system("PAUSE");
    8. return 0;
    9. }
    10. void hier()
    11. {
    12. int v;
    13. v=6*5;
    14. printf("Hier ist der Wert von v %i\n\n", v);
    15. dort();
    16. }
    17. void dort()
    18. {
    19. int v;
    20. v+=5;
    21. printf("Dort ist der Wert von v %i\n\n", v);
    22. }
    Alles anzeigen