memcpy()不';好像不行

memcpy()不';好像不行,c,memcpy,C,Memcpy,我在memcpy()方面遇到了问题,我不知道哪里出了问题 代码可以在这里看到: 我哪里出错了 谢谢 当指定%s时,printf需要以null结尾的字符串。它不能告诉你分配了18个字节,你想打印这些字节的内容。它查看*str,看到一个空字节,然后停止查看。str是一个字符串(char*以'\0'结尾),而hdr是一个结构,它甚至没有字符串字段。如果要将hdr转换为人类可读的字符串,则必须使用printf或sprintf以及适当的转换说明符。好的,您可以设置hdr.num=0,因此复制的内存块的第一

我在memcpy()方面遇到了问题,我不知道哪里出了问题

代码可以在这里看到:

我哪里出错了


谢谢

当指定
%s
时,
printf
需要以null结尾的字符串。它不能告诉你分配了18个字节,你想打印这些字节的内容。它查看
*str
,看到一个空字节,然后停止查看。

str
是一个字符串(
char*
'\0'
结尾),而
hdr
是一个结构,它甚至没有字符串字段。如果要将
hdr
转换为人类可读的字符串,则必须使用
printf
sprintf
以及适当的转换说明符。

好的,您可以设置
hdr.num=0,因此复制的内存块的第一个字节等于
0
,因此字符串的第一个字符为NULL,这标志着它的结束,因此不打印任何内容

您的数据正在移动。如果您声明:

tmp_str* str2 = (tmp_str*)str;

然后它将在调试器中正确显示。您只是看错了数据——代码执行正常。

正如前面指出的,因为str
的第一个字节是
'\0'
。一个简单的printf(“%s”,str)语句将不执行任何操作(它将在指示“字符串结束”的第一个字节处停止)。相反,你可以试试看

int ii;
printf("STR in hex:\n");
for(ii = 0; ii < sizeof(hdr); ii++) {
  printf("%02x ", str[ii]);
}
printf("\n");

您将看到实际的字符(但其中一些字符可能“无法打印”,并且可能会在您的终端中产生意外的副作用)。

是的,这是正确的,但为什么str指向的内存区域是空的(在gdb跟踪中)?@F430:因为gdb也希望使用以null结尾的字符串。@^:然后,我怎样才能真正看到记忆中的东西?我想我不能使用str,因为它是gdb中的char*@F430:?我相信有一个命令可以打印出内存区域的内容,您可以在其中指定起始地址和长度。用那个。在你的实际代码中?使用
tmp\u str
。不要试图把事情当作字节序列来处理,除非这是处理它们的最自然的方式。我只想要数据移动,实际上不想把hdr变成字符串。
tmp_str* str2 = (tmp_str*)str;
int ii;
printf("STR in hex:\n");
for(ii = 0; ii < sizeof(hdr); ii++) {
  printf("%02x ", str[ii]);
}
printf("\n");
int ii;
printf("STR in hex:\n");
for(ii = 0; ii < sizeof(hdr); ii++) {
  printf("%c", str[ii]);
}
printf("\n");