C memmove(MSDN)-敏捷的棕色狐狸/狗

C memmove(MSDN)-敏捷的棕色狐狸/狗,c,msdn,memmove,C,Msdn,Memmove,我在这里阅读了有关memmove的MSDN文章: 我无法从他们的例子中看出memmove和memcpy的区别。它们都给出了相同的结果,尽管示例是为了说明差异。请帮助。这是一个扩展的评论,不是答案。MSDN示例很糟糕,被两个类似的源字符串“快速棕色狐狸跳过懒狗”和“快速棕色狗跳过懒狐狸”弄糊涂了。当源代码和目标代码确实重叠时,My MS Visual C会使用memcpy()给出正确的结果,但正如@PaulRoub所写的(现已删除),仅仅因为一个编译器正确地对其进行了编码并不意味着另一个编译器会

我在这里阅读了有关memmove的MSDN文章:


我无法从他们的例子中看出memmove和memcpy的区别。它们都给出了相同的结果,尽管示例是为了说明差异。请帮助。

这是一个扩展的评论,不是答案。MSDN示例很糟糕,被两个类似的源字符串“快速棕色狐狸跳过懒狗”和“快速棕色狗跳过懒狐狸”弄糊涂了。当源代码和目标代码确实重叠时,My MS Visual C会使用
memcpy()
给出正确的结果,但正如@PaulRoub所写的(现已删除),仅仅因为一个编译器正确地对其进行了编码并不意味着另一个编译器会这样做

#include <stdio.h>
#include <string.h>

int main()
{
    char str [] = "abcdefghijklmnopqrstuvwxyz";
    printf ("%s\n", str);    

    memcpy (str, str+1, 25);    // copy down
    printf ("%s\n", str);    

    memcpy (str+1, str, 25);    // copy up
    printf ("%s\n", str);    

    return 0;
}

只有当源和目标重叠时,它们才会不同。是的,Barmar,但在重叠的示例中,我看不出有什么不同。哦,感谢各位的负面观点。建议的链接根本不能回答我的问题。我问的是MSDN上的文章,而不是函数本身。文章中引用的结果不同:
函数:带重叠的memmove…结果:快快的棕色狐狸跳过了懒狗
函数:带重叠的memcpy…结果:快快的棕色狗跳过了懒狗
。另外,对重叠数据使用
memcpy()
会导致未定义的行为,包括“按预期工作”的可能性。JonathanLeffler,非常感谢。几分钟前我得出了同样的结论。这是MSDN写得很差的一篇文章。
abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyzz
bbcdefghijklmnopqrstuvwxyz