Veränderter Variablenwert nach Ausgabe (printf)?



  • Hallo zusammen ...

    Da eins meiner kleinen Programme zZ nicht so recht funktioniert hab ich mal etwas rumgespielt. Dabei hab ich spaßenshalber auch ein paar Sachen probiert, welche man eigentlich nicht macht 😃

    Dabei ist mir etwas sehr komisches aufgefallen...

    m=7;
    printf("%f %d\n",m,m);
    

    Erwartete Ausgabe: "x.xxxxxx 7"
    (die x stehen für ne beliebige Zahl)

    Wirkliche Ausgabe: "0.000000 1778324347"

    Ändere ich den Quellcode wieder zu

    m=7;
    printf("%d %d\n",m,m);
    

    Erhalte ich die erwarteten "7 7".
    Es scheint also so, alsob die Variable durch die Ausgabe im falschen Format verändert wird!
    Ist sowas normal? 😃 🙄

    Vielen Dank für euere Hilfe!



  • Durch das falsche Format erhälst du undefiniertes Verhalten. Da kann theoretisch *alles* passieren.



  • 😮
    Also ich hätte schon gedacht, dass es da irgend nen Sicherheitsmechanismus gibt, welcher dafür sorgt, dass zumindest die Daten nicht verändert werde, wenn schon die Ausgabe murks ist...

    Ich werds berücksichtigen...

    Aber warum kann ich dann zB einen char ohne Probleme aus Zahl ausgeben lassen?



  • Mandel schrieb:

    Also ich hätte schon gedacht, dass es da irgend nen Sicherheitsmechanismus gibt, welcher dafür sorgt, dass zumindest die Daten nicht verändert werde, wenn schon die Ausgabe murks ist...

    Wie kommst du darauf, dass die Daten verändert werden?

    Lars



  • Mandel schrieb:

    Aber warum kann ich dann zB einen char ohne Probleme aus Zahl ausgeben lassen?

    1. Weil char auch ein Integertyp ist (Je nach Compiler entweder unsigned oder signed mit in der Regel 8 Bit Länge - Sprich entweder 0..255 oder -128..+127).
    2. Weil du vielleicht auch mit anderen Ausgaben Glück haben kannst, aber genauso gut Probleme bekommen könntest.



  • Mandel schrieb:

    Also ich hätte schon gedacht, dass es da irgend nen Sicherheitsmechanismus gibt [...]

    Was die C-Funktionen betrifft, siehts bezüglich Sicherheit relativ schlecht aus. Du musst entweder gut aufpassen oder C++-Äquivalente ( std::cout ) benutzen.



  • Hallo,

    printf ist eine Funktion mit variabler Anzahl von Parametern. Außer dem Formatstring weiß der Compiler daher nicht, welche Parametertypen die Funktion erwartet. Sie werden daher so übergeben, wie sie kommen, wobei aber floats automatisch nach double konvertiert werden.

    printf erwartet nun, daß die Variablen genau so übergeben werden, wie sie mit dem Formatstring angekündigt wurden. Wenn Du lügst, bekommst Du halt Unsinn geliefert.

    Moderne Compiler kennen zwar diese Problematik und analysieren den Formatstring. Das ist aber nicht vom Standard gefordert und daher darfst Du dich darauf nicht verlassen, zumal das auch nur dann funktionieren wird, wenn der Formatstring als Literal übergeben wurde.

    mfg Martin



  • Für typsichere formatierte Ausgabe ähnlich wie printf() gäbe es auch Boost.Format.


Log in to reply