Vertauschen der Variablendeklaration hat Auswirkungen!!!?



  • Folgende 2 Quelltexte liefern in der Ausführung unterschiedliche Ergebnisse:

    #include <stdio.h>
    
    int main(void)
    {
    short z;
    short s;
    
    puts("-> Anzahl der Zeilen eingeben:");
    scanf("%d", &z);
    printf("\nZur Kontrolle: Zeilen= %d\n", z);
    
    puts("\n-> Anzahl der Spalten eingeben:");
    scanf("%d", &s);
    
    printf("\Nach Eingabe der Spalten sind die Zeilen= %d\n", z);
    
    printf("\nGesamt:\n%d Zeilen, %d Spalten\n",z,s);
    
    return 0;
    }
    

    und

    #include <stdio.h>
    
    int main(void)
    {
    short s;
    short z;
    
    puts("-> Anzahl der Zeilen eingeben:");
    scanf("%d", &z);
    printf("\nZur Kontrolle: Zeilen= %d\n", z);
    
    puts("\n-> Anzahl der Spalten eingeben:");
    scanf("%d", &s);
    
    printf("\nNach Eingabe der Spalten sind die Zeilen= %d\n", z);
    
    printf("\nGesamt:\n%d Zeilen, %d Spalten\n",z,s);
    
    return 0;
    }
    

    wie man sieht sind nur die variablendeklarationen vertauscht.
    Das "falsche" Programm kann man jedoch korrigieren wenn man als Formatstring %hd verwendet, hat mir mein Professor gesagt. Doch jetzt wüßte ich gerne genauer wieso. Am besten wär es wenn irgendwo ne ausführliche Beschreibung der scanf-Funktion in Zusammenhang mit Formatstrings zu finden wäre. Danke



  • Beide Programme sind falsch, und können durch %hd korrigiert werden. Wenn du %d angibst, nimmt scanf den Typ int an. Deine Variablen haben aber den Typ short. Wenn die beiden Typen unterschiedliche Größen haben (meistens 16bit und 32bit), kommt es zu Problemen.



  • Bashar schrieb:

    Beide Programme sind falsch, und können durch %hd korrigiert werden. Wenn du %d angibst, nimmt scanf den Typ int an. Deine Variablen haben aber den Typ short. Wenn die beiden Typen unterschiedliche Größen haben (meistens 16bit und 32bit), kommt es zu Problemen.

    Ja beide mögen ja falsch sein, aber das eine lässt sich wenigstens durch umstellung der variablendeklarationen "richtig funktionierend" machen. und ich möchte wissen, wieso das so ist?

    PS: den Formatstring %hd bzw. die Tatsache dass man darauf aufpassen muss, findet man nicht in vielen C-Nachschlagewerken 😕



  • Wir gehen jetzt einmal von gängigen 32Bit Systemen aus:

    short hat 16Bit und int 32Bit

    Wenn du nun
    scanf("%d",&s);
    machst, werden beginnend ab &s 32Bit (4Byte) in den Speicher geschrieben. Was dazu führt, dass mehr geschrieben wird, als s groß ist.

    Da nun aber z direkt nach s kommt (was durchaus nicht sein muss, wir müssen hier also beten, dass es funktioniert) werden die restlichen 2 Byte in z geschrieben.

    Fazit: Finger weg von sowas, und nicht %d verwenden wenn man short will.


Anmelden zum Antworten