Is dit een bug?

Status
Niet open voor verdere reacties.

Ruudje62

Nieuwe gebruiker
Lid geworden
2 sep 2009
Berichten
4
Ik gebruik in visual studio 2008 c++ een structure als volgt:

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;

typedef struct { DWORD dt;
BYTE chan;
BYTE sz;
BYTE id;
BYTE x[8];
BYTE flag;
} RECSTRUCT;

Deze struct is dus 16 bytes lang, en werkt prima.

Wat ik eigenlijk wil is dit:

typedef struct { DWORD dt;
BYTE chan;
BYTE sz;
BYTE id;
union {
BYTE x[8];
WORD wrd;
};
BYTE flag;
} RECSTRUCT;

Dus een unnamed union in een struct. Het programma gaat op zijn bek. de struct is plotseling 20 bytes lang. De x[...] zijn opgeschoven.

Doe ik iets fout?
Gr
Ruud
 
Je 'BYTE x[8]' zal waarschijnlijk als pointer behandeld worden, en vandaar dat deze een grootte van 4 bytes oplevert in plaats van de 8 bytes die je zou verwachten.

Code:
    double *x = new double, y;
    std::cout << sizeof(x) << '\n'; // 4
    std::cout << sizeof(y) << '\n'; // 8


Met iets als onderstaande krijg je wel de juiste grootte:
http://msdn.microsoft.com/en-us/library/83ythb65.aspx

Code:
typedef struct { DWORD dt;
BYTE chan;
BYTE sz;
BYTE id;
__declspec (align(8)) union {
BYTE x[8];
WORD wrd;
};
BYTE flag;
} RECSTRUCT;

Code:
std::cout << sizeof(RECSTRUCT) << '\n'; // 24
 
Bedankt voor de snelle reactie!

Maar een bepaalde byte array is binnen een union of struct geen pointer maar een reek bytes. Als dit trouwens zo zou zijn, zou de struct lengte korter worden ipv langer (12 ipv 20) en zou ik hetzelfde probleem hebben zonder de union.

Ik heb echter wel het vermoeden dat het wat met alignment te maken kan hebben. Hoe dan ook, ik denk echt dat het een bug is. Als ik van de wrd variable binnen de union een BYTE maak werkt alles prima. De struct lengte klopt dan weer (alleen wil ik geen BYTE maar een WORD :-)

Ik ben echt nieuwsgierig..
Gr
Ruud
 
Dit heeft denk ik inderdaad met alignment te maken.
Je kan het volgende proberen.
#pragma pack(push,1)
typedef struct { DWORD dt;
BYTE chan;
BYTE sz;
BYTE id;
union {
BYTE x[8];
WORD wrd;
};
BYTE flag;
} RECSTRUCT;
#pragma pack(pop)
 
Hey!!!

Prima hoor!! Werkt als een trein:thumb: Toch blijf ik dit een bug vinden:-)

Hartstikke bedankt. Weer wat geleerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan