Lokale Variablen, die übergeben werden (C ++)

8

Ich habe ein Problem beim Lernen von C ++ festgestellt, wo eine lokale Variable in einer Funktion an die lokale Variable mit dem gleichen Namen in einer anderen Funktion übergeben wird. Beide Funktionen laufen in main ().

Wenn dies ausgeführt wird,

%Vor%

es gibt aus:

%Vor%

Ich erwartete, dass wieder () null oder 0 sagen würde, da 'a' dort wieder deklariert wird, und doch scheint es den Wert zu verwenden, den 'a' in next () zugewiesen wurde.

Warum übergibt next () den Wert der lokalen Variablen 'a' erneut an (), wenn 'a' erneut zu einem anderen Zeitpunkt erklärt wird ()?

    
Jeffrey Malone 23.03.2016, 02:47
quelle

3 Antworten

7

Ссылка

Sie haben Recht, eine nicht initialisierte Variable ist ein No-No. Sie dürfen jedoch eine Variable deklarieren und erst später initialisieren. Speicher ist reserviert, um die ganze Zahl zu halten, aber welcher Wert in dieser Erinnerung ist, bis du das tust, kann alles sein. Einige Compiler initialisieren Variablen automatisch auf Junk-Werte (um Ihnen beim Auffinden von Fehlern zu helfen), einige werden automatisch auf die Standardwerte initialisiert und andere tun gar nichts. C ++ selbst verspricht nichts, daher ist es undefiniertes Verhalten. In Ihrem Fall, mit Ihrem einfachen Programm, ist es einfach genug, sich vorzustellen, wie der Compiler Assembler-Code erstellt hat, der genau dasselbe Speicherstück wiederverwendete, ohne es zu verändern. Das ist jedoch blindes Glück, und selbst in Ihrem einfachen Programm wird nicht garantiert passieren. Diese Arten von Fehlern können tatsächlich ziemlich heimtückisch sein, also machen Sie es zur Regel: Seien Sie wachsam gegenüber nicht initialisierten Variablen.

    
mock_blatt 23.03.2016, 02:55
quelle
5

Eine nicht initialisierte nicht static lokale Variable vom * eingebauten Typ (puh! das war ein Bissen) hat einen unbestimmten Wert . Mit Ausnahme der char -Typen ergibt die Verwendung dieses Werts formal Undefiniertes Verhalten , a.k.a. UB . Alles kann passieren, einschließlich des Verhaltens, das du siehst.

Offenbar wurde der Stapelbereich, der für a im Aufruf von next verwendet wurde, mit Ihrem Compiler und den Optionen nicht für etwas anderes verwendet als bis zum Aufruf von again , wo er für% co_de wiederverwendet wurde % in a , jetzt mit dem gleichen Wert wie zuvor.

Aber Sie können sich nicht darauf verlassen. Mit UB kann alles oder nichts passieren.

* Oder allgemeiner von POD-Typ, Plain Old Data . Die Spezifikation des Standards ist etwas kompliziert. In C ++ 11 beginnt es mit §8.5 / 11, "Wenn für ein Objekt kein Initialisierer angegeben ist, wird das Objekt standardmäßig initialisiert; Wenn keine Initialisierung durchgeführt wird, hat ein Objekt mit automatischer oder dynamischer Speicherdauer einen unbestimmten Wert. ". Wo "automatische ... Speicherdauer" den Fall der lokalen nicht again Variable beinhaltet. Und wo die "no initialization" auf zwei Arten über §8.5 / 6 auftreten kann, die default initialization definiert, nämlich entweder über einen do-nothing-Standardkonstruktor oder über das Objekt, das nicht vom Klassen- oder Array-Typ ist.

    
Cheers and hth. - Alf 23.03.2016 02:55
quelle
1

Dies ist völlig zufälliges und undefiniertes Verhalten.

Was passiert ist, ist, dass Sie zwei Funktionen haben, die unmittelbar nacheinander aufgerufen werden. Beide haben mehr oder weniger identische Funktionsprotokolle und beide reservieren eine Variable von genau der gleichen Größe auf dem Stapel.

Da keine anderen Variablen im Spiel sind und der Stapel zwischen den Aufrufen nicht geändert wird, passiert es nur zufällig, dass die lokale Variable in der zweiten Funktion "landing" an derselben Stelle wie die lokale Variable der vorherigen Funktion steht / p>

Natürlich ist das nicht gut, auf das man sich verlassen kann. In der Tat ist es ein perfektes Beispiel dafür, warum Sie immer Variablen initialisieren sollten!

    
David Hoelzer 23.03.2016 02:54
quelle

Tags und Links