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) ?


  • Mod

    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.


Anmelden zum Antworten