使用memcpy将结构体转换为字符数组

Converting a struct to char array using memcpy

本文关键字:字符 数组 转换 结构体 memcpy 使用      更新时间:2023-10-16

我正试图将以下结构体转换为字符数组,以便我可以通过串行端口发送它。

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 b[sizeof(struct foo)];
memcpy(b, &dvar, sizeof(struct foo));

然而,由于某些原因,我在字符数组

中得到了这些尾随值
0x0A 0xFF

我最初认为它正在获取值,因为当我将其转换为字符数组时,它有效地将其转换为字符串,所以我认为这是NULL ''

任何帮助都将不胜感激。

谢谢

在现代处理器上,sizeof(struct data download)需要在32位边界上对齐。您的数据结构大小为8个字符+ 1个短(16位)整数。编译器需要在结构的大小上增加2个字符,以便在赋值时能够正确处理它。由于您正在通过串行线进行通信,并且确切地知道您要发送的内容,因此您最好指定您愿意通过串行线发送的确切字节数:2 +/*1 short */+ 8(8字节)。

我偷偷摸摸地怀疑你正在使用8位微控制器!可以通过打印b[sizeof(foo)]b[sizeof(foo)+1]进行调试这将是你的两个角色。如果你注意到,你不应该引用这些,它们在你的字符数组的边界之外。例如n元素数组[0..(n-1)](从你的struct复制)

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

或者像@Melebius那样做一个指针赋值。