Problem mit Alignment von Strukten



  • Hallo,

    Ich verstehe die Welt nicht mehr, denn irgendwie scheint hier der Compiler mist zu bauen. Denn wenn ich es richtig sehe, dann sollte die Struktur BMPHeader genau 6 Byte groß sein. Wenn ich es aber durch den Compiler mittels sizeof ermitteln lassen, dann meint der es wären 8 Bytes, was natürlich nicht in meinem Interesse ist. Habe ich hier eine Fehler eingebaut, oder ist es wirklich ein Fehler des Compilers (mingw)? Denn es scheint so als würde uint16_t 32 statt 16 Bit belegen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    
    struct BMPHeader {
      uint16_t type;
      uint32_t size;
    };
    
    char* readBMP(char *filename) {
    
      FILE *f;
      if ((f = fopen(filename, "r")) == NULL) {
        printf("Fehler (open)\n");
        return NULL;
      }
    
      struct BMPHeader h;
    
      // Hier folgt die böse Zeile, die nur richtig die Werte ausliest,
      // wenn ich 6 Bytes selber angebe.
    
      if (fread(&h, 6/*sizeof(struct BMPHeader)*/, 1, f) != 1) {
        printf("Fehler (fread)\n");
        fclose(f);
        return NULL;
      }
    
      printf("type: %i size: %i\n", h.type, h.size);
    
      fclose(f);
    }
    
    int main(int argc, char *argv[]) {
    
      readBMP("E:\\Granit.bmp");
    
      system("PAUSE");
      return 0;
    
    }
    


  • Probier es mal mit:

    #pragma pack(1)
    struct BMPHeader { 
      uint16_t type; 
      uint32_t size; 
    }; 
    #pragma pack(0)
    


  • Danke, das war genau das was ich gesucht habe. Jetzt funktionierts einwandfrei. 👍 😃



  • Habe ich hier eine Fehler eingebaut, oder ist es wirklich ein Fehler des Compilers (mingw)?

    Nee, ein Fehler des Compilers ist das nicht. Strukturen werden halt entsprechend ausgerichtet. #pragma pack kann zwar helfen, ist aber nicht portabel.



  • Hi!

    Gibt es denn alternativ eine portable Möglichkeit Strukturen nach eigenen Wünschen auszurichten?

    Cya, dynamite.



  • Mir ist davon jedenfalls nix bekannt. Du kannst schon #pragma pack verwenden, da viele Compiler das mittlerweile unterstützen. Aber niemand gibt dir darauf eine Garantie. Deshalb ist es imo immer noch am besten, wenn du deinen Code so gestaltest, dass Struktur Alignment möglichst keine Rolle spielt. Auch wenn das hier und da auf Kosten des Handlings geht.


Anmelden zum Antworten