为什么在从Struct到数组字节的转换中获得额外的字节?

时间:2017-03-08 23:41:35

标签: c++ arrays struct visual-studio-2015 memcpy

我的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指令?

其他信息:

  • 操作系统Windows 2012 r2。
  • Visual Studio 2016,版本14.0.25431.01更新3.
  • 语言:C ++ 11
  • 项目类型是控制台应用程序。
  • 此行为同时出现在x86和x64中。

0 个答案:

没有答案