Großes Wundern beim Ermitteln der struct-Größe
-
Hallo,
ich möchte ein vorhandenes struct TBenutzer um einige Eigenschaften vergrößern. Zu diesem Zweck hatte ich bereits beim Anlegen des structs Reserven angelegt (cReserve[]), um bereits vorhandene Daten, z.B. in Dateien, weiterbenutzen zu können.
Jetzt muss ich aber feststellen, dass das „Verrechnen“ von benötigtem Speicher für die verschiedenen Variablentypen nicht wie erwartet funktioniert.
Altes struct:
#define BENUTZER_MAX 20; struct TBenutzer { int iID_Benutzer; char cVorname[BENUTZER_MAX + 1]; char cNachname[BENUTZER_MAX + 1]; char cBenutzername[BENUTZER_MAX + 1]; char cPasswort[BENUTZER_MAX + 1]; bool bAnmeldung_muss; bool bPasswort_muss; char cReserve[249]; };Wenn ich per sizeof(Benutzer) die struct-Größe ermittle, erhalte ich den Wert 340.
Das neue struct soll um die Eigenschaften dtVon, dtBis und bGueltig erweitert werden. Das erfordert für zwei TDateTimes je 8 Byte und ein bool nochmal 1 Byte, macht 17. Um diese 17 Byte verringere ich mein cReserve[249] auf cReserve[232].
#define BENUTZER_MAX 20; struct TBenutzer { int iID_Benutzer; char cVorname[BENUTZER_MAX + 1]; char cNachname[BENUTZER_MAX + 1]; char cBenutzername[BENUTZER_MAX + 1]; char cPasswort[BENUTZER_MAX + 1]; bool bAnmeldung_muss; bool bPasswort_muss; TDateTime dtVon; TDateTime dtBis; bool bGueltig; char cReserve[232]; };Wenn ich jetzt per sizeof(Benutzer) die struct-Größe ermittle, erhalte ich den Wert 352.
Wie kann das sein bzw. was mache ich falsch?Gruß
Leo
-
Leo Freitag schrieb:
Wenn ich jetzt per sizeof(Benutzer) die struct-Größe ermittle, erhalte ich den Wert 352.
Wie kann das sein bzw. was mache ich falsch?kann sein, dass dein compiler alle struct-members an durch 4 teilbare adressen speichert? vielleicht kennt borland #pragma pack(1) ?
-
Hallo
BCB->Projekt->Optionen->Erweiterte Compiler-Optionen->Datenausrichtung
MfG
Klaus
-
Danke für die Tipps. Jetzt wäre nur noch schön wissen, welche Auswirkung sonst noch diese Einstellungen der Datenausrichtung haben.
Gruß
Leo
-
Achtung, wenn Du da jetzt nachträglich etwas änderst kannst Du alte Structs nicht mehr aus Dateien lesen. Passe Deine Berechnung der Ausrichtung an.