Problem mit Adressen



  • Hallo ihr alle,
    ich hab ein Problem mit der Adresse einer Variable in einem struct...
    Zugegebenermaßen hab ich keine Ahnung was ich falsch gemacht hab...

    typedef struct _FAT_12_BOOTSECTOR
    {
           unsigned char Jmp[3];
           unsigned char OemName[8];
           unsigned short BytesPerSector;
           unsigned char SectorsPerCluster;
           //...
    }FAT_12_BOOTSECTOR;
    

    Wenn ich jetzt versuche auf BytesPerSector zuzugreifen bekommen ich falsche Werte. Und zwar ist BytesPerSector um ein Byte im Speicher "verschoben"(weiß nicht wie ich sonst ausdrücken soll). Es wird ein Byte zwischen OemName und BytesPerSector ausgelassen...
    Wenn ich BytesPerSector als char schreibe funktionierts...bis auf die Tatsache das ich nur die "unter Hälfte" der Daten bekomme die ich brauch ^^...

    Hat jemand eine Idee was da falsch läuft???
    Hat es vllt irgendwas mit den Arrays zu tun???

    Also ich programmier schon ne kleine weile aber sowas is mir noch nie passiert...

    Danke schonmal im voraus...
    gruß



  • Pyscho schrieb:

    Hallo ihr alle,
    ich hab ein Problem mit der Adresse einer Variable in einem struct...
    Zugegebenermaßen hab ich keine Ahnung was ich falsch gemacht hab...

    typedef struct _FAT_12_BOOTSECTOR
    {
           unsigned char Jmp[3];
           unsigned char OemName[8];
           unsigned short BytesPerSector;
           unsigned char SectorsPerCluster;
           //...
    }FAT_12_BOOTSECTOR;
    

    Wenn ich jetzt versuche auf BytesPerSector zuzugreifen bekommen ich falsche Werte.

    Wie greifst du denn auf BytesPerSector zu?

    Psycho schrieb:

    Und zwar ist BytesPerSector um ein Byte im Speicher "verschoben"(weiß nicht wie ich sonst ausdrücken soll). Es wird ein Byte zwischen OemName und BytesPerSector ausgelassen...

    Das sind Padding Bytes oder Füllbytes. Guckst du hier: Typical alignment of C structs on x86



  • Short-Variable, also bei Dir "BytesPerSector" beginnen immer an einer durch
    zwei, ohne Rest, teilbaren Adresse. Um das in deiner struct zu erreichen,
    hat der Compiler ein Füllbyte einsetzen müssen - alles klar?



  • Ich greif ganz normal auf die Member des structs zu

    FAT_12_BOOTSEC fat12;
    printf("%d",fat12.BytesPerSector); //ausgabe 514
    

    Die sache mit den Füllbytes kann auch nicht sein da wenn ich BytesPerSector ausgeben lass Daten aus den nachfolgenden Variablen bekommen. Nähmlich SectorsPerCluster auch...

    Hier mal noch die Daten die in dem Struct gespeichert sein sollten...

    fat12.OemName = "MSDOS5.0";  //8 Bytes passt also
    fat12.BytesPerSector = 0x0200; //2 Byte
    fat12.SectorsPerCluster = 0x02; //1 Byte
    

    Ausserdem bekomme ich so

    unsigned char *test = (unsigned char*)&fat12b.BytesPerSector;
        test--;
        unsigned short *test2 = (unsigned short*)test;
        printf("%d",*test2); //ausgabe 512
    

    Die Richtigen werte...



  • egon2 schrieb:

    Short-Variable, also bei Dir "BytesPerSector" beginnen immer an einer durch
    zwei, ohne Rest, teilbaren Adresse. Um das in deiner struct zu erreichen,
    hat der Compiler ein Füllbyte einsetzen müssen - alles klar?

    ok mag sein...aber warum bekomm ich dann daten aus den nachfolgenden variablen???



  • ok ich glaub ich habs verstanden...
    der compiler macht die verschieden datentypen mit ihren füllbytes...
    ich jedoch hab meine daten einfach von anfang der struct in den speicher geschrieben und hab nun probleme die richtigen daten wieder auszulesen....

    nun nächste frage: kann man das mit den füllbytes igendwie abstellen??



  • srry hätt mir erst mal die verlinkte seite ganz durchlesen sollen...
    habs jetzt gelöst...

    danke leute für die hilfe...


Anmelden zum Antworten