我试图将结构字段(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
如果在记忆中我删除了'&'将第二个参数写入缓冲区它会导致分段错误,但如果我不这样做,它会将167120959(我将它是它的地址)复制到缓冲区而不是实际值。
非常感谢你的帮助!我试图尽可能地描述,希望你能帮助我。
答案 0 :(得分:2)
但如果我打印:
printf("offset: %ld \n",&packet->payload.offset)
,我 得到:offset: 167120959
那是因为你打印的是一个地址,而不是一个值。你的“序列化”方法没问题(除了字节序),因为memcpy
需要地址。
我删除'&'写入'5'到缓冲区的第二个参数 [...]但是,如果我不这样做,它会复制167120959(我认为它就是它 地址)到缓冲区而不是实际值。
错误。它会从该地址复制sizeof(long int)
字节。
答案 1 :(得分:0)
But if I print: printf("offset: %ld \n",&packet->payload.offset), I get: offset: 167120959
这是错误的,它打印的地址为packet->payload.offset
,而不是packet->payload.offset
本身。
Memcpy必须提供变量的地址,否则它不能修改它(在C中没有传递的参数参数)。所以你传递memcpy()
变量的地址,但是printf()
只需要读取它,所以你可以(并且应该)直接传递变量。