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

5
我正在尝试将以下结构体转换为字符数组,以便通过串口发送。
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

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

任何帮助都将不胜感激。

谢谢


4
我不清楚datadownload结构体在哪里,以及它的大小是多少。 - Gopi
1
“trailing values”是什么意思?你如何检查数组的内容?你是在编写C还是C++代码?语义可能不同。另外,你有没有考虑使用联合(union)来代替? - Some programmer dude
2
https://dev59.com/jnVD5IYBdhLWcg3wAWoO - Lundin
2
如果你将它转换为 char 数组,没有人会为你添加 NULL 终止符。你需要自己添加。 - fuz
2
在这个例子中,你的 memcpy 是无用的,因为类型转换是通过将 &dvar 作为 void * 类型的参数传递来实现的。这也可以工作:char *b = &dvar; 或者更好的写法是 char *b = (char *)&dvar; - Melebius
显示剩余6条评论
2个回答

4

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


1
我有一个暗示,你可能在使用 8bit 微控制器!你可以通过打印 b[sizeof(foo)]b[sizeof(foo)+1] 来调试。这将是你的两个字符。 如果你注意到了,你不应该引用它们,它们超出了 char 数组的边界。例如,n 元素数组 [0..(n-1)](从你的结构体复制)。
如果你向你的结构体添加一个未使用的元素(或增加最后一个成员的大小),那么 char 数组就可以用 '\0' 终止——编译器可能希望这样做。
或者像 @Melebius 所示,进行指针赋值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接