【问题标题】:memmove (MSDN) - the quick brown fox/dog [duplicate]memmove(MSDN)-快速的棕色狐狸/狗[重复]
【发布时间】:2015-03-01 01:04:54
【问题描述】:

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

http://msdn.microsoft.com/en-us/library/aa246469%28v=vs.60%29.aspx

我无法从他们的示例中看出 memmove 与 memcpy 有何不同。尽管示例是为了显示差异,但它们都给出了相同的结果。请帮忙。

【问题讨论】:

  • 它们仅在源和目标重叠时有所不同。
  • 是的 Barmar,但在重叠的例子中,我看不出有什么区别。
  • 哦,谢谢你们的负面评价。建议的链接根本没有回答我的问题。我问的是 MSDN 上的文章,而不是函数本身。
  • 文章中引用的结果不同:Function: memmove with overlap … Result: The quick quick brown fox jumps over the lazy dogFunction: memcpy with overlap … Result: The quick quick brown dog jumps over the lazy fox。此外,在重叠数据上使用memcpy() 会导致未定义的行为——包括“按预期工作”的可能性。
  • JonathanLeffler,非常感谢。几分钟前我得出了同样的结论。那是 MSDN 写的一篇糟糕的文章。

标签: c msdn memmove


【解决方案1】:

这是一个扩展评论而不是答案。 MSDN 示例是一个糟糕的示例,被两个相似的源字符串“The quick brown fox jumps over the lazy dog”和“The quick brown dog jumps over the lazy fox”混淆了。当源和目标重叠时,我的 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;
}

程序输出

abcdefghijklmnopqrstuvwxyz
bcdefghijklmnopqrstuvwxyzz
bbcdefghijklmnopqrstuvwxyz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多