Struktur and Padding.
-
Hallo,
hab noch mal eine Frage zum Padding Problem bei strukturen.. ich hab mich mal informiert und es auch verstanden wie das Padding funktioniert.
Aber wovn hängt es ab ob der compiler Padding verwendet? vom CPU x86 oder vom c-standart C89/C99?Weil ich schreibe C-Scripte in einer umbegung welche den C89 standart verwendet. "#pramga pack(1)" ist ja für den VC spezifischen compiler oder?
Grüße
-
Padding haengt in erster Linie vom CPU-Typ ab, ja. Wie und ob man das Padding steuern kann, ist aber natuerlich compiler-spezifisch. Der Standard sagt nur "padding ist erlaubt", nicht mehr.
-
Hmm, d.h. wenn die C-scripte der Umgebung auf einem x86 CPU laufen, muss ich wohl mit padding rechen!?
Gibt es ne möglichkeit nicht nur die größe sonder auch die Struktur einer Struktur zu ermittepn?;)
bsp:
struct DATA{ char x; int a,b; long c; }
nun die grö0e: 12
struktur wäre hier jetzt bspw: 1,4,4,4
-
Du kannst bestenfalls die Größe der Struktur mit der Summe der Elemente vergleichen, dann weißt du die Anzahl der Padding-Bytes. Und du kannst mit offsetof() feststellen, wieviel Platz zwischen den einzelnen Elementen liegt:
int padding_x = offsetof(struct DATA,a)-offsetof(struct DATA,x)//Platz für x inklusive Padding-Bytes - sizeof(char); //Platz für x netto
(der Standard garantiert zumindest, daß die Struct-Elemente in der Reihenfolge im Speicher stehen, die bei der Definition angegeben wurde)
(btw, 1+4+4+4 ergibt 13 ;))
-
BorisDieKlinge schrieb:
Gibt es ne möglichkeit nicht nur die größe sonder auch die Struktur einer Struktur zu ermittepn?;)
Ja, sicher. Du holst dir nen Zeiger auf die Struktur und castest den entsprechend der struct-member, um reinzugucken:
#include <stdio.h> //#pragma pack(1) struct DATA{ char x; int a,b; long c; }d={'1',2,3,4}; int main() { struct DATA* pt = &d; char* pc; int* pi; long* pl; printf("%d\n", sizeof(struct DATA)); printf("%c\n", *pt ); pc = (char*)pt; pc++; pi = (int)pc; printf("%d\n", *pi ); pi++; printf("%d\n", *pi ); pi++; pl = (long)pi; printf("%ld\n",*pl ); return 0; }
Ohne die pack Anweisung wird bei mir als Größe 16 ausgegeben, der Inhalt von x ist zwar '1' aber der Rest stimmt dann nicht mehr.
Mit der pack Anweisung ist alles oki doki.
-
kuggug ! schrieb:
Ohne die pack Anweisung wird bei mir als Größe 16 ausgegeben, der Inhalt von x ist zwar '1' aber der Rest stimmt dann nicht mehr.
Mit der pack Anweisung ist alles oki doki.Sowas nennt man dann aber "Glück". Du könntest dir aber auch dein Programm pulverisieren, weil der int-Zeiger nicht passend im Speicher ausgerichtet ist (und der Compiler nichts davon bemerkt).
-
[quote="CStollSowas nennt man dann aber "Glück". Du könntest dir aber auch dein Programm pulverisieren, weil der int-Zeiger nicht passend im Speicher ausgerichtet ist (und der Compiler nichts davon bemerkt).[/quote]
Lies doch noch einmal etwas gründlicher
Die int-Zeiger stimmen ja auch nicht, ohne die pack Anweisung.Mit pack Anweisung stimmt die Größe und auch der Inhalt der Variablen.
mfg k.
-
Mit Glück meinte ich auch die Tatsache, daß du "nur" falsche Werte erhältst - könnte durchaus passieren, daß dir das Programm mit einem Bus-Fehler abschmiert.