我的C ++和VS-2015存在下一个结构问题:
struct HEADER
{
char BRI;
char crv_lenght;
__int16 crv;
char messagetype;
};
此结构的大小为5个字节,但当它转换为字节数组时,生成的数组的大小为6个字节。
我用来将结构转换为数组的方式是使用memcpy:
HEADER hdr;
hdr.BRI = 0x08
hdr.crv_lenght =0x02;
hdr.crv = 0;
hdr.messagetype = 0x04;
char* buffer;
buffer = new char[sizeof(HEADER)];
memcpy(buffer, tmpBuff, *size);
在将结构转换为数组之后,缓冲区显示一个额外的字节(0xcc
),它出现在 crv 字段之后:
DEBUG DATA HEX(字节1-6)[08 02 00 00 cc 04]
但是,当我将结构改为使用char[2]
而不是__int16
时,就像这样:
struct HEADER
{
char BRI;
char crv_lenght;
char crv[2];
char messagetype;
};
生成的数组大小为 5个字节,删除了额外的字节:
DEBUG DATA HEX(第1-5栏)[08 02 00 00 04]
我找到了解决问题的方法。此问题使用指令#pragma pack(push,1)
和#pragma pack(pop)
,如下例所示:
#pragma pack(push,1)
struct HEADER
{
char BRI;
char crv_lenght;
__int16 crv;
char messagetype;
};
#pragma pack(pop)
所以,主要的问题是:对于使用VS-2015的C / C ++编译器,这个行为是预期的,为什么它需要使用#pragma pack
指令?
其他信息: