structure packing



  • hi,

    hätte mal eine frage zu structuren also,

    struct a{
        char ax;
        char bx;
        char cx;
    };
    
    struct b{
        char ax;
        int bx;
        int cx;
    };
    

    könnte es nicht sein dass der compiler struct b so umstellt
    dass es am ende so auschaut?

    struct b{
        int bx;
        int cx;
        char ax;
    };
    

    ich frage das deshalb weil sonst a->ax == b->ax aber
    ((char *)a)[0] != ((char *)b)[0] ist und wenn ich dass
    jetzt auf ne disk oder über das netzwerk verschike kann es doch
    passieren dass mal abgesehen von der byteorder fehler entstehen
    besonders wenn es mit verschieden compilern compiliert ist?



  • c_newbie schrieb:

    hätte mal eine frage zu structuren also,

    struct a{
        char ax;
        char bx;
        char cx;
    };
    
    struct b{
        char ax;
        int bx;
        int cx;
    };
    

    könnte es nicht sein dass der compiler struct b so umstellt
    dass es am ende so auschaut?

    struct b{
        int bx;
        int cx;
        char ax;
    };
    

    nee, eher so (wenns eine 32-bit cpu und deshalb 4-aligned ist):

    struct b
    {
       char ax;
       /* 3 bytes lücke */
       char bx;
       /* 3 bytes lücke */
       char cx;
       /* 3 bytes lücke */
    };
    

    ^^also schon mit löchern, aber die reihenfolge der members wird nicht verändert.

    ich frage das deshalb weil sonst a->ax == b->ax aber
    ((char *)a)[0] != ((char *)b)[0]

    auf structs als char* zuzugreifen geht oft schief. du könntest mit #pragma pack(1) z.b. (compilerabhängig), das alignment abschalten, aber sowas ist doof. wenn du lieber char*-zugriffe machen willst, dann benutze ein char-array statt 'ner struct.
    🙂


Anmelden zum Antworten