lokale Variable hat "fremden" Wert



  • manni66 schrieb:

    Variablen haben einen zufälligen Wert (hier den Wert der anderen Funktion), wenn du sie nicht initialisierst. Die Initialisierung mit 0 ist also notwendig und keine Umgehung eines Effekts.

    Wieso denken eigentlich so viele Leute, dass Variablen automatisch mit 0 belegt werden. Ist das in anderen Sprachen der Fall?



  • out schrieb:

    manni66 schrieb:

    Variablen haben einen zufälligen Wert (hier den Wert der anderen Funktion), wenn du sie nicht initialisierst. Die Initialisierung mit 0 ist also notwendig und keine Umgehung eines Effekts.

    Wieso denken eigentlich so viele Leute, dass Variablen automatisch mit 0 belegt werden. Ist das in anderen Sprachen der Fall?

    Ja. Z.B. Java.
    Edit: Murks. Java verbietet das.



  • War das nicht so, dass dies auf globale Variabel nicht zutrifft, da diese immer mit 0 initialisiert werden?



  • Citizen42 schrieb:

    War das nicht so, dass dies auf globale Variabel nicht zutrifft, da diese immer mit 0 initialisiert werden?

    Variablen die im statischen Speicher abgelegt werden, werden mit 0 belegt. Also globale Variablen und lokale static Variablen.


  • Mod

    Citizen42 schrieb:

    War das nicht so, dass dies auf globale Variabel nicht zutrifft, da diese immer mit 0 initialisiert werden?

    Variablen mit statischer Speicherdauer, ja.


  • Mod

    out schrieb:

    Citizen42 schrieb:

    War das nicht so, dass dies auf globale Variabel nicht zutrifft, da diese immer mit 0 initialisiert werden?

    Variablen die im statischen Speicher abgelegt werden, werden mit 0 belegt. Also globale Variablen und lokale static Variablen.

    Sowie statische Klassenmember.



  • Ah ok, danke euch beiden.


  • Mod

    Auch im Falle statischer Variablen ist es für gewöhnlich gute Praxis, ein = 0 (oder passend analog) hinzuschreiben.



  • Citizen42 schrieb:

    War das nicht so, dass dies auf globale Variabel nicht zutrifft, da diese immer mit 0 initialisiert werden?

    Ja, denn das kostet keine Laufzeit, anders als bei lokalen. Deswegen kann das da gemacht werden.



  • out schrieb:

    manni66 schrieb:

    Variablen haben einen zufälligen Wert (hier den Wert der anderen Funktion), wenn du sie nicht initialisierst. Die Initialisierung mit 0 ist also notwendig und keine Umgehung eines Effekts.

    Wieso denken eigentlich so viele Leute, dass Variablen automatisch mit 0 belegt werden. Ist das in anderen Sprachen der Fall?

    War glaub ich damals im C64-BASIC so.



  • ich habe den folgenden Code

    #include <iostream>
    #include <cstring>
    using namespace std;
    //...
    void entferneLeerzeichen(char wort[]) {
    	int laenge = strlen(wort);
    	char ohneLZ[] = "";
    	int i = 0;  //warum?
    	for (int i = 0; i < laenge; i++) {
    		if (wort[i] != ' ') {
    			push(ohneLZ, wort[i]);
    		}
    	}
    	cout << ohneLZ;
    }
    //...
    

    (ja ich muss leider <csting> statt <vector> benutzen)
    Diese Funktion bekommt einen char-vektor mit 8 Zeichen (4 davon Leerzeichen).
    Die Funktion strlen soll die Länge ermitteln (8 stimmt). Die darauf folgende for-Schleife soll 8 mal laufen und die if-Abfrage soll prüfen, ob in dem char-vektor "wort" unter den Indizes "i" ein Leerzeichen (' ') befindet. Wenn nicht, soll mit der push-Funktion das Zeichen an die variable "ohneLZ" drangeklebt werden.
    Das funktioniert alles wunderbar. Aber ohne die Zeile 8 hängt sich das Programm auf. bzw. wenn ich in der Funktion noch mal einen int definiere (egal wo) wird nonsense in ohneLZ gespeichert.

    wieso nehmen sich Variablen fremde Werte aus anderen Variablen? Ohne jegliche zuweisung? Die Zeile 8 ist überflüssig. Aber ohne sie läufts nicht.


  • Mod

    Wieso denken eigentlich so viele Leute, dass Variablen automatisch mit 0 . werden.

    Weil

    • ... beim Debuggen der Stack ausgenullt wird (Ich glaube allerdings nicht nach jedem `leave`, oder?)
    • ... Variablen mit static storage duration zero-initialized werden. Das beinhaltet jedes Anfängers Leib und Seele, globale Variablen.
    • Weil Klassen durch Konstruktoren initialisiert werden, da scheint es als ob Skalare irgendwie durch einen Wert initialisiert werden. Die Inkonsistenz der Initialisierungszwangs ist irgendwie problematisch.

  • Mod

    char ohneLZ[] = "";
    

    Dieses Array hat Platz für 1 Element. Du packst in Zeile 11 aber vermutlich bis zu 8 rein.



  • SeppJ schrieb:

    char ohneLZ[] = "";
    

    Dieses Array hat Platz für 1 Element. Du packst in Zeile 11 aber vermutlich bis zu 8 rein.

    Das stimmt. Kann ich eine char Variable deklarieren, ohne ihr sagen zu müssen, was später alles reinkommt? Oder soll ich einfach einen großen Wert wählen (und hoffen, dass er nicht überschritten wird)?


Anmelden zum Antworten