0

我试图将结构字段(int)序列化为 char* 缓冲区,但我认为我做错了。

这就是我用来复制此字段的内容。

memcpy(payload + offset, &packet->payload.offset, sizeof(long int));

packet->payload.offset 是一个 long int 并且包含值“5”(硬编码),请注意:

如果我打印:printf("offset: %ld \n", packet->payload.offset); 我得到:offset: 5

但是如果我打印: printf("offset: %ld \n",&packet->payload.offset),我会得到:offset: 167120959

如果在 memcopy 中我删除了第二个参数的 '&' 以将 '5' 写入缓冲区,则会导致分段错误,但如果我不这样做,它会将 167120959(我认为它是地址)复制到缓冲区而不是实际值。

非常感谢您的帮助!我试图尽可能地描述,希望你能帮助我。

4

2 回答 2

2

但是如果我打印: printf("offset: %ld \n",&packet->payload.offset),我会得到:offset: 167120959

那是因为您打印的是地址,而不是值。您的“序列化”方法是可以的(除了字节顺序),因为memcpy需要地址。

我删除了第二个参数的 '&' 以将 '5' 写入缓冲区 [...] 但如果我不这样做,它会将 167120959 (我假设它是地址)复制到缓冲区而不是实际值.

错误的。它从该地址复制sizeof(long int)字节。

于 2012-05-20T18:03:39.623 回答
0
But if I print: printf("offset: %ld \n",&packet->payload.offset), I get: offset: 167120959

错了,它打印的是地址packet->payload.offset而不是packet->payload.offset它自己。

Memcpy 必须提供变量的地址,否则它不能修改它(在 C 中没有传递 byref 参数)。因此,您传递memcpy()了变量的地址,但printf()只需要读取它,因此您可以(并且应该)直接传递变量。

于 2012-05-20T18:07:23.830 回答