使用memcpy将struct转换为char数组

时间:2015-10-20 06:18:25

标签: c++ c arrays struct

我正在尝试将以下结构转换为char数组,以便我可以通过串口发送它。

struct foo
{
    uint16_t voltage;
    char ID ;
    char TempByte;
    char RTCday[2];
    char RTCmonth[2];
    char RTCyear[2];
    char RTChour[2];
    char RTCmin[2];
    char Sepbyte;   
}dvar = { 500, 'X' , '>' , "18" , "10" , "15" , "20" , "15" , '#'};

然后我使用以下内容将其转换为char数组:

char b[sizeof(struct foo)];
memcpy(b, &dvar, sizeof(struct foo));

但是出于某种原因,我在char数组中得到了这些尾随值

0x0A 0xFF

我最初认为它是获取值,因为当我将它转换为char数组时,它实际上将它转换为字符串,所以我虽然是NULL'\ 0'

任何帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:4)

在现代处理器上,sizeof(结构数据下载)需要在32位边界上对齐。您的数据结构大小为8个字符+ 1个短(16位)整数。编译器需要在结构大小上添加2个字符才能在分配时正确处理它。 由于您通过串行线路进行通信并确切知道要发送的内容,因此您可以指定您愿意通过串行线路发送的确切字节数:2 + / * 1 short * / + 8 (8个字节)。

答案 1 :(得分:1)

我怀疑你正在使用8位微控制器! 您可以通过打印b[sizeof(foo)]b[sizeof(foo)+1]进行调试 这些将是你的两个角色。 如果你注意到,你不应该引用它们,它们超出了char数组的范围。例如n个元素数组[0 ..(n-1)](从你的结构中复制)

如果向结构中添加一个未使用的元素(或增加最终成员的大小),则可以终止char数组'\ 0' - 编译器可能想要这样做。

或者执行@Melebius显示的指针赋值。