在ANSI C中将Int值序列化为char *缓冲区

时间:2012-05-20 18:01:27

标签: c pointers serialization segmentation-fault memcpy

我试图将结构字段(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(我将它是它的地址)复制到缓冲区而不是实际值。

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

2 个答案:

答案 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()只需要读取它,所以你可以(并且应该)直接传递变量。