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.