Was passiert, wenn ich eine nicht initialisierte Variable in C++ drucke?

Lesezeit: 5 Minuten

Was passiert wenn ich eine nicht initialisierte Variable in C
Josef Nields

Warum druckt das 32767 (oder eine andere Zufallszahl)? Was ist std::cout Drucken? Warum nicht NULL (oder 0)?

int main() 
{
    int a;
    std::cout << a;
}

  • Warum ist es nicht NULL (oder 0)? Weil der Standard nicht sagt, dass es auf 0 initialisiert werden muss.

    – drescherjm

    12. Mai 2015 um 1:52 Uhr

  • Warum schauen die Leute einfach gerne in den Lauf und ziehen den Abzug und fragen: “Warum habe ich mir den Kopf weggeblasen? Sollte er nicht entladen sein, als ich die Waffe aufhob”?

    – Benutzer3528438

    12. Mai 2015 um 1:55 Uhr

  • Ihre Verwendung des Begriffs “nicht instanziierte Referenz” ist falsch. int a ist keine Referenzvariable, sondern eine einfache alte Wertvariable. Und obwohl ich noch nie jemanden über das “Instanziieren” primitiver Typen sprechen hörte (normalerweise verwenden die Leute das Wort “Instanziieren”, wenn es um benutzerdefinierte Klassen geht, d.h class oder struct Typen), wenn Sie eine Wertvariable definieren (was Sie mit int a), dann wird es sicherlich instanziiert.

    – bgoldst

    12. Mai 2015 um 1:57 Uhr


  • @ user3528438, aus Java stammend, das nicht einmal Zeiger zulässt (obwohl Arrays ziemlich nah beieinander liegen), ist dies etwas anders

    – Josef Nields

    12. Mai 2015 um 1:57 Uhr

  • Komisch, ich konnte noch keinen Duplikat dieser Frage für C++ finden, obwohl ich mir ziemlich sicher bin, dass sie schon einmal jemand gestellt hat. Die meisten Fragen und Antworten sind nur C-getaggt, wie diese hier, obwohl in diesem Fall genau dasselbe für C++ gilt.

    – vssoftco

    12. Mai 2015 um 2:08 Uhr


Was passiert wenn ich eine nicht initialisierte Variable in C
vssoftco

Das liegt daran, dass Variablen mit automatischer Speicherdauer in C++ nicht automatisch auf Null initialisiert werden. In C++ zahlen Sie nicht für das, was Sie nicht brauchen, und das automatische Initialisieren einer Variablen braucht Zeit (das Setzen eines Speicherplatzes auf Null reduziert sich letztendlich auf Maschinenbefehle), die dann in elektrische Signale übersetzt werden, die die physischen Bits steuern ).

Der Variable wird ein Speicherplatz reserviert, und es kommt vor, dass sich an diesem Speicherplatz etwas Müll befindet. Dieser Müll wird von ausgedruckt cout.

Wie von @dwcanillas betont, handelt es sich um ein undefiniertes Verhalten. Verwandte: Was passiert mit einer deklarierten, nicht initialisierten Variablen in C? Hat es einen Wert?

Aus dem C++-Standard (meine hervorheben):

8.5 Initialisierer [dcl.init]

7) Ein Objekt vom Typ T standardmäßig zu initialisieren bedeutet:

  • Wenn T ein (möglicherweise CV-qualifizierter) Klassentyp ist (Klausel 9), werden Konstruktoren berücksichtigt. Die anwendbaren Konstruktoren werden aufgezählt (13.3.1.3), und der beste für den Initialisierer () wird durch Überladungsauflösung (13.3) ausgewählt. Der so ausgewählte Konstruktor wird mit leerer Argumentliste aufgerufen, um >> das Objekt zu initialisieren.
  • Wenn T ein Array-Typ ist, wird jedes Element standardmäßig initialisiert.
  • Andernfalls wird keine Initialisierung durchgeführt.

12) Wenn für ein Objekt kein Initialisierer angegeben ist, wird das Objekt standardmäßig initialisiert. Wenn eine Speicherung für ein Objekt mit automatischer oder dynamischer Speicherdauer erhalten wird, hat das Objekt einen unbestimmten Wert, und wenn für das Objekt keine Initialisierung durchgeführt wird, behält dieses Objekt einen unbestimmten Wert, bis dieser Wert ersetzt wird (5.18). [Note: Objects with static or thread storage duration are zero-initialized, see 3.6.2. — end note ] Ergibt eine Auswertung einen unbestimmten Wert, ist das Verhalten undefiniert außer in folgenden Fällen:

— Wenn ein unbestimmter Wert des vorzeichenlosen schmalen Zeichentyps (3.9.1) erzeugt wird durch die Auswertung von:

— der zweite oder dritte Operand eines Bedingungsausdrucks (5.16),

— der rechte Operand eines Kommaausdrucks (5.19),

— der Operand einer Umwandlung oder Konvertierung in einen vorzeichenlosen schmalen Zeichentyp (4.7, 5.2.3, 5.2.9, 5.4) oder

— ein Ausdruck mit verworfenen Werten (Klausel 5)

  • C und C++ haben etwas unterschiedliche Regeln bezüglich nicht initialisierter Variablen. In C, ein unbestimmter Wert können sich in Berechnungen ausbreiten. Zum Beispiel int x; int y = x - 1; ist in C zulässig und führt zu y auch unbestimmt sein. Allerdings verursacht das UB in C++.

    – MM

    12. Mai 2015 um 2:15 Uhr


  • @MattMcNabb ja, ich vermutete, dass es Unterschiede geben könnte, suchte inbrünstig nach einem Betrüger. Aber am Ende habe ich die Standardzitate gefunden 🙂

    – vssoftco

    12. Mai 2015 um 2:25 Uhr

Es ist undefiniertes Verhalten. Sie drucken, was auch immer die Erinnerung einnimmt awas in diesem Fall zufällig der Fall ist 32767.

  • @vsoftco stackoverflow.com/questions/11962457/… Um fair zu sein, dachte ich aber nicht, dass es UB war 🙂

    – dwcanillas

    12. Mai 2015 um 1:54 Uhr

  • interessant… Ich schaue mir den Beitrag mal an, danke! Sie haben Recht, es ist UB, auch verwandt mit stackoverflow.com/a/1597426/3093378, +1

    – vssoftco

    12. Mai 2015 um 1:55 Uhr


  • Deine Antwort widerspricht sich. Sie geben zuerst (richtig) an, dass das Programm ein undefiniertes Verhalten hat, und beschreiben dann “was es tut”, als ob es ein definiertes Verhalten hätte.

    – Asteroiden mit Flügeln

    15. November 2020 um 17:23 Uhr

  • @AsteroidsWithWings Ich bin anderer Meinung. Meine Ansicht (zumindest im Kontext dieser Antwort) ist, dass “undefiniertes Verhalten” “unvorhersehbares Verhalten” ist. Ich habe nicht impliziert, dass sein Code immer ausgegeben wird 32767. Das war nur das Beispiel, das er benutzte, und er sagte sogar, dass das Verhalten nicht konsequent sei. Ich habe nur auf das Ergebnis des undefinierten Verhaltens im Kontext der Frage hingewiesen.

    – dwcanillas

    16. November 2020 um 19:05 Uhr

  • Es gibt kein “Ergebnis undefinierten Verhaltens”. Das Verhalten ist nicht definiert. Das ist buchstäblich der Punkt. Zumindest ist dies ein wenig irreführend hinsichtlich dessen, was in der Praxis vernünftigerweise erwartet werden kann.

    – Asteroiden mit Flügeln

    16. November 2020 um 19:17 Uhr


Was passiert wenn ich eine nicht initialisierte Variable in C
MM

Das Verhalten wird von C++14 (N3936) abgedeckt. [dcl.init]/12:

Wenn für ein Objekt kein Initialisierer angegeben ist, wird das Objekt standardmäßig initialisiert. Wenn eine Speicherung für ein Objekt mit automatischer oder dynamischer Speicherdauer erhalten wird, hat das Objekt eine unbestimmter Wertund wenn für das Objekt keine Initialisierung durchgeführt wird, behält dieses Objekt einen unbestimmten Wert, bis dieser Wert ersetzt wird.

[…] Ergibt sich aus einer Bewertung ein unbestimmter Wert, Das Verhalten ist undefiniert außer in folgenden Fällen:

und Ihr Code wird von keinem der “folgenden Fälle” abgedeckt, die einige Situationen abdecken, in denen unsigned char unbestimmte Werte dürfen sich ausbreiten.

Weil “a” nicht global/statisch ist. Es ist eine automatische Variable, für die die Initialisierung zur Laufzeit erfolgt. Wenn es global wäre, wäre die Initialisierung auf Null zur Kompilierzeit erfolgt. dh

• Statische Variablen werden zur Kompilierzeit initialisiert, da ihre Adresse bekannt und fest ist. Ihre Initialisierung auf 0 verursacht keine Laufzeitkosten.

• automatische Variablen können unterschiedliche Adressen für unterschiedliche Aufrufe haben und müssten zur Laufzeit jedes Mal initialisiert werden, wenn die Funktion aufgerufen wird, wodurch Laufzeitkosten entstehen, die möglicherweise nicht benötigt werden. Wenn Sie diese Initialisierung benötigen, fordern Sie sie an.

988600cookie-checkWas passiert, wenn ich eine nicht initialisierte Variable in C++ drucke?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy