C语言memove()函数输出错误?

C language wrong output of memove() function?

无法弄清楚为什么我从这段代码得到了这个输出。

#include<stdio.h>
#include<string.h>
int main()
{
    char str[] = "I live in NY city";

    printf("%s%s\n","The string in array str[] before invokihg the function memmove(): ",str);

    printf("%s%s\n","The string in array str[] before invokihg the function memmove(): ",memmove(str,&str[7],10));
        return 0;
}

我的输出是:in NY cityNY city
是不是应该是:in NY city i live

这是我书中的类似示例,但它很有意义。

#include<stdio.h>
#include<string.h>
int main()
{
    char x[] = "Home Sweet Home";

    printf("%s%s\n","The string in array x[] before invoking the function memmove(): ",x);

    printf("%s%s\n","The string in array x[] before invoking the function memmove(): ",memmove(x,&x[5],10));
        return 0;
}   

这里的输出是:Sweet Home Home
根据 memmove() 函数的定义是正确的,即将第二个参数指向的对象复制指定数量的字节到第一个参数指向的对象中。(具有相同的字符串) Also object这里指的是一块数据。

我认为您误以为 memmove 应该以某种方式交换目标和源的非重叠部分。这不是它的工作原理。您可能混淆了书中的示例,因为单词 "Home" 出现了两次。将其更改为 "Home Sweet HOME" 以便您可以看到发生了什么,然后阅读 memmove 的 documentation/specification 而不是猜测它的作用。

你的期望是错误的。

你定义了一个字符串:

char str[] = "I live in NY city";

然后从字符串的末尾到开头移动(复制)10 个字节:

"I live in NY city[=11=]";
 012345678901234567
       /        /
      /        /
     /        /
    /        /
   /        /
  /        /
"in NY cityNY city[=11=]";

其他的都没有动过。