为什么memmove()函数以这种方式工作?

时间:2017-07-26 14:05:27

标签: c memmove

我在Stack Overflow上遇到了与memmove() vs memcpy()相关的各种问题。

这篇帖子暗示如果源地址(要复制的数据)大于目的地址(要复制的数据),它将执行正向复制,否则将执行向后复制。

为什么会那样?我尝试了两种情况下的复制,并且完美无缺,没有任何错误。

你能详细说明吗?我没理由。

编辑:这就是我的意思:

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

void *memmoveCustom(void *dest, const void *src, size_t n)
{
    unsigned char *pd = (unsigned char *)dest;
    const unsigned char *ps = (unsigned char *)src;
    if ( ps < pd )
        for (pd += n, ps += n; n--;)
            *--pd = *--ps;
    else
        while(n--)
            *pd++ = *ps++;
    return dest;
}

int main( void )
{
    printf( "The string: %s\n", str1 );

    memmoveCustom( str1 + 1, str1, 9 );
    printf( "Implemented memmove output: %s\n", str1 );

    getchar();
}

上面的程序是一个实现自定义memmove()函数的示例代码。 在函数内部,您可以看到源地址大于目标地址的时间,它执行正向复制,否则它将n位置添加到现有地址并从后向执行复制。 就是这样。

1 个答案:

答案 0 :(得分:15)

  

如果源地址(要复制的数据)大于目标地址(要复制的数据),它将执行正向复制,否则将执行向后复制。

仅当fromto范围重叠时,此功能才有用。对于非重叠范围,复制方向无关紧要。

重叠范围很重要,因为如果从头开始复制,则会在复制之前销毁源数据。