memcpy,memmove重叠拷贝

内存的复制一般使用memmove和memcopy这两种函数,当内存不重叠时,这两个函数可以说是没有区别的。但当出现内存重叠时,就会出现不同的结果。
内存的复制函数一般定义如下:

void *fun(void *dest, const void *src, size_t count)

函数将从原一地址复制到目标内存地址,复制的内存数据大小为count。
但是在内存复制时,一般又是一个字节一个字节复制的,所以当内存重叠时,有可能出现复制前面一般的字节的时候,会修改即将要复制的的数据,造成数据复制后和复制前的数据不一致。
1603886653017

如上面所示,如果使用strcpy和memcpy函数对于第一种情况会拷贝出错。而memmove可以解决内存重叠问题。

strcpy,memcpy是从头部开始复制数据。
memmove通过判断指针来选择使用增量复制还是减量复制。

解决的核心就是判断内存首指针的大小

  • 当目的地址小于源地址时,所以会出现在目的地址的尾部(或源地址的头部)出现数据重叠,这以这时从头部开始复制数据。
  • 当目的地址大于源地址时,会出现在目的地址的头部(或源地址的尾部)出现数据重叠,这时就不可以从头开始复制数据了,因为这样复制的前一段字节会到目的地址,而这个目的地址又是源地址一段即将要复制的数据,出现数据覆盖拷贝,但如果从尾部开倒车进行复制,就没有问题。
void *memmove(void *dest, const void *src, size_t count)
{
    char *tmp;
    const char *s;

    if (dest <= src) {
        tmp = dest;
        s = src;
        while (count--)
            *tmp++ = *s++;
    } else {
        tmp = dest;
        tmp += count;
        s = src;
        s += count;
        while (count--)
            *--tmp = *--s;
    }
    return dest;
}
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by bytekits.com,汇天下文字,成非凡梦想!!!