我尝试将measure_msg (结构测试)复制到缓冲区。然而,下面的代码似乎没有复制数据。值返回值
**** 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;
}发布于 2012-05-09 15:31:58
你在做一些奇怪的事情,但是,看看这个:
sprintf(ptr, "%02d%02d", 50, 0);您将在缓冲区中写入一个字符串。现在buf将包含"5000“。请注意,它不会包含值50和0,而是它们的字符串表示!
现在,当您将缓冲区复制到结构中时,您将把它的字段设置为这四个字节,但是它们不是您在打印字符串时看到的,而是它的ASCII码。请注意,在此行上:
fprintf(stderr, "buff[%d]=%c - ", i, buff[i]);将缓冲区的内容打印为字符,'5‘存储为0x35 (十进制为53),然后它将是结构的第一个字节的内容(依此类推)。
如果这真的是你想要做的,你的代码是准确的(但是你玩了太多的指针,这只是一个测试吗?)但这真的很奇怪,否则你走错了方向去做你需要的事情。
发布于 2012-05-09 15:37:22
memcpy ()调用在我的系统(GCC/MinGW,Windows)上工作正常。你没有得到正确的输出,因为被复制到缓冲区的一些“字符”是不可打印的。
试一试
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-09 15:40:35
当您将measure_msg复制到buff时,您正在复制int类型的值。之后,您将打印char类型的值。int类型的值由4个字节组成,它们可能没有打印表示:即33752069个int值,0x02030405为十六进制格式,具有4个字节,一旦像字符一样打印出来,就会得到0x02、0x03、0x04和0x05字符值。
更改您的打印掩码以使用int值,并将每个buff[i]转换为int,您的值将被打印出来。
fprintf(stderr, "buff[%d]=%d - ", i, (int)buff[i])https://stackoverflow.com/questions/10511559
复制相似问题