struct-Wirrwarr



  • Hi,
    kann mir jemand erklären wieso keine Warnings/Fehler in Zeile 24 , 30, 32 auftauchen und bei der Ausgabe von p_BB->c nicht die untersten 3 Bytes von der darauffolgenden Ausgabe(p_BB->d) auftauchen. [GNU GCC]
    Danke!

    #include <stdio.h>
    #pragma pack(1)
    int main(void)
    {
        struct A{
        int a;
        char b;
        int c;
        };
    
        struct B{
        int a;
        int b;
        char c;
        int d;
        };
    
        struct A AA;
        struct B * p_BB;
        AA.a=0xCCDDEEFF;
        AA.b=0x77;
        AA.c=0x8899AABB;
    
        p_BB= (void*)&AA;
    
        //p_BB= (struct B *)&AA;
    
        //p_BB= &AA; // assignment warning, wie zu erwarten
    
        printf("%#X  -  %#X  -  %#X \n",p_BB->a,p_BB->b,p_BB->c);
    
        printf("%#X\n",p_BB->d);
    
        getchar();
        return 0;
     }
    


  • Weil du mit dem Schrott

    (void*)&AA;
    

    dem Compiler jede Möglichkeit nimmst, bei deinem Unsinnscode zu warnen.



  • Vielleicht hilft dir offsetof

    Und mach dich mal über Alignement schlau.



  • Ein Cast deaktiviert nunmal das Typsystem an der entsprechenden Stelle, deshalb keine Warnung. (deshalb sollte man auch nur casten wenn es unbedingt nötig ist)

    Du greifst mit p_BB->d auf nicht initialisierten Speicher zu, denn struct A ist kleiner als struct B, das Verhalten ist hier undefiniert.

    p_BB->c ist nur ein byte groß, woher sollen die 3 bytes kommen.



  • Wutz schrieb:

    Unsinnscode

    Das Beispiel, ja.

    DirkB schrieb:

    Und mach dich mal über Alignement schlau.

    Sollte kein structure padding auftreten, #pragma pack(1), falls du das damit meinst.

    gary1195 schrieb:

    p_BB->c ist nur ein byte groß, woher sollen die 3 bytes kommen.

    Die Ausgabe von printf liefert mir: 0xFFFFFF88. Woher kommen die FF?

    Falls es interessiert, meine Frage kommt von der Zuweisung aus Zeile 2, vllt. kann mir ja auch jemand direkt erklären was hier passiert.

    struct snd_soc_dai *dai;
    struct some_dev *dev = snd_soc_dai_get_drvdata(dai);
    


  • Peter767 schrieb:

    gary1195 schrieb:

    p_BB->c ist nur ein byte groß, woher sollen die 3 bytes kommen.

    Die Ausgabe von printf liefert mir: 0xFFFFFF88. Woher kommen die FF?

    Dein char wurde durch die Regeln für variable Argumentlisten in einen int umgewandelt, 0x88 ist negativ also wird mit einsen aufgefüllt.



  • Danke, verstanden.



  • Das Dereferenzieren von inkompatiblen Zeigertypen ist UB.
    Für solche Frickelei, wie du sie versuchst, nimmt man union.


Log in to reply