0

我试图 memcpy measure_msg (struct test) 到一个缓冲区。但是,下面的代码似乎没有复制数据。价值回报

**** ptr:0xb781c238
**** ptr:0xb781c23c
**** ptr:0xb781c244
buff[0]=5 - buff[1]=0 - buff[2]=0 - buff[3]=0 - buff[4]=W - buff[5]= - buff[6]= - buff[7]= - buff[8]= - buff[9]= - buff[10]= - buff[11]= - 

这段代码出了什么问题?

struct test{
  int mode;
  int id;
};

int func()
{   
int i, size;
struct test measure_msg;
char buff[20];
char* ptr;    

memset(&measure_msg, 0x00, sizeof(struct test));

ptr = buff;
fprintf(stderr, "**** ptr:%p\n", ptr);
sprintf(ptr, "%02d%02d", 50, 0);
ptr += 4;
size = 4;
size += sizeof(struct test);

fprintf(stderr, "**** ptr:%p\n", ptr);

measure_msg.id = 9999;
measure_msg.mode = 1111;

memcpy(ptr, &measure_msg, sizeof(struct test));
ptr += sizeof(struct test);

fprintf(stderr, "**** ptr:%p\n", ptr);

for (i=0; i<size; i++){
  fprintf(stderr, "buff[%d]=%c - ", i, buff[i]);
}

return 0;
}
4

3 回答 3

1

你正在做一些奇怪的事情,但是,看看这个:

sprintf(ptr, "%02d%02d", 50, 0);

您将向缓冲区写入一个字符串。现在buf将包含“5000”。请注意,它不包含值 50 和 0,而是它们的字符串表示形式

现在,当您将缓冲区复制到您的结构时,您会将其字段设置为这四个字节,但它们不是您在打印字符串时看到的,而是它的ASCII 代码。请注意,在这一行:

fprintf(stderr, "buff[%d]=%c - ", i, buff[i]);

您将缓冲区的内容打印为字符,“5”存储为 0x35(十进制为 53),然后它将是结构第一个字节的内容(依此类推)。

如果这确实是您想要做的,那么您的代码是准确的(但是您使用指针玩得太多了,这只是一个测试吗?)但这真的很奇怪,否则您会走错方向去做您需要的事情.

于 2012-05-09T07:31:58.010 回答
0

当您memcpy复制int 类型值measure_msg时。buff之后,您将打印 char 类型的值。int 类型值由 4 个字节组成,可能没有打印表示:即 33752069 int 值,十六进制格式的 0x02030405,有 4 个字节,一旦像字符一样打印,您将获得 0x02、0x03、0x04 和 0x05 字符值。

更改您的打印 masc 以使用 int 值并将每个buff[i]转换为 int 并且您的值将被打印。

fprintf(stderr, "buff[%d]=%d - ", i, (int)buff[i])
于 2012-05-09T07:40:35.160 回答
0

memcpy () 调用在我的系统(GCC/MinGW,Windows)上运行良好。您没有得到正确的输出,因为复制到 buff 中的某些“字符”是不可打印的。

尝试

fprintf (stderr, "buff[%d]=%x - ", i, buff[i]);

反而。

数据将存储为

buff [0]  = 0x35  /* ASCII for '5' */
buff [1]  = 0x30  /* ASCII for '0' */
buff [2]  = 0x30
buff [3]  = 0x30
buff [4]  = 0x57  /* as 1111 is 0x00000457 in hex */
buff [5]  = 0x04  /* stored in little endian convention */
buff [6]  = 0x00  /* and here size of int = 4 */
buff [7]  = 0x00
buff [8]  = 0x0F  /* as 9999 is 0x0000270F in hex  */
buff [9]  = 0x27
buff [10] = 0x00
buff [11] = 0x00 

但是,通过将结构复制到字符数组中,您无论如何都想做什么?

于 2012-05-09T07:37:21.807 回答