c - memcpy 结构失败

标签 c memcpy

我尝试将measure_msg(struct test)memcpy到缓冲区。但是,下面的代码似乎没有复制数据。返回值

**** 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;
}

最佳答案

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

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

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

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

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

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

如果这确实是你想要做的,你的代码是准确的(但是你玩了太多指针,这只是一个测试吗?)但这真的很奇怪,否则你就走错了方向你需要什么。

关于c - memcpy 结构失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10511559/

相关文章:

c - MPI_Scatter 和 MPI_Gather 不起作用

c++ - 复制到 vector<unsigned char> 中的无类型对象的内容

c++ - 如何将结构拆分为 block 以便将字节保存到 C/C++ 中的另一个数据结构?

使用 node-ipc 和 unix 套接字在 NodeJS 和 C 之间进行通信

c - 将字符串的一部分 append 到另一个字符串

c - OpenCv 中的人脸检测除了 Haar 级联之外?

linux - 复制到 DMA 缓冲区时,memcpy() 在 __memcpy_neon 中挂起

c++ - 如果我用memcpy函数复制一个数组,可能会有什么后果: bottlenecks and perfomance changes?

c - 修改字符串数据

c - C中的内存替换?