C语言,memcpy 和memmove函数在使用时如何选择? 如何判断两个指针所指向的内存区域是否有重叠?

今天学习了memcpy和memmove函数,如果两个数组的内存区域有重叠的部分,那么memcpy在处理这样的数组时,有可能会发生错误,而memmove能够处理这样的问题。

1、 在需要拷贝数组的时候,到底是先择memcpy还是选择memmvoe? 功能一样,我到底用哪个?

2、怎样判断两个指针所指的区域有没有重叠? 我怎么就一眼能看出来有重叠?

谢谢!

memmove和memcpy函数👉https://blog.csdn.net/muxuen/article/details/122691244

  • 拷贝数组的时候选用memmove更好
  • 判断重叠,需要计算起始地址+拷贝数据量后是否已经到达了目标地址。比如一个数组a[10],我们写入起始地址a[1],目标地址a[3],拷贝5个int类型的大小,这个时候就是重叠了!

memmove和memcpy函数的区别及实现:https://blog.csdn.net/gogogo_sky/article/details/72593513

内存区域重叠是指内存区域[src, src+count)和内存区域[dst, dst+count)有重叠。memcpy只是简单的内存拷贝,没有考虑内存有重叠的情况,如果内存有重叠,其行为是undefined。而memmove考虑内存重叠的情况,即使内存有重叠也能正常拷贝。一般来说,如果自己能确定拷贝内存没有重叠,用memcpy比用memmove更高效,如果有重叠,则只能用memmove

(1)memcpy()函数是从前向后拷贝;假如出现内存重叠的现象;拷贝结果可能出错;
(2)memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;引入了倒序拷贝的方式处理内存重叠的某些状况;保证拷贝的正确性;
memmove函数的功能同memcpy基本一致,可是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝,在现实中使用memmove()函数会比较好一点

操作中我们要判断的有重叠的话那肯定是mommove函数,其实c中memcpy只需要完成拷贝的任务,不考虑重叠,但是在c中已经完善了这个功能,发展中memmcpy可以说是memmove的前身。使用时更推荐使用memmove,因为他更加完善,不必要考虑更多

void* my_memmove(void* dst, const void* src, size_t n)
{
    char* s_dst;
    char* s_src;
    s_dst = (char*)dst;
    s_src = (char*)src;
    if(s_dst>s_src && (s_src+n>s_dst)) {      //-------------------------第二种内存覆盖的情形。
        s_dst = s_dst+n-1;
        s_src = s_src+n-1;
        while(n--) {
            *s_dst-- = *s_src--;
        }
    }else {
        while(n--) {
            *s_dst++ = *s_src++;
        }
    }
    return dst;
}

这个函数就是判断,从后面开始复制

https://blog.csdn.net/qq_38131333/article/details/81210568

可以看看源码的解释,一般判断内存是否重叠用的是指针

https://blog.csdn.net/zhongcanw/article/details/67632065