memcpy拷贝重叠及memmove

一.memcpy
功能:从源内存地址起始位置拷贝若干个字节到目标地址中

void* my_memcpy(void* dst, const void* src, size_t count) { void* ret = dst; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = https://www.it610.com/article/(char*)src + 1; } return ret; }

但是在拷贝重叠时则可能会出现错误:
例如:
int main() { char arr1[20] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; my_memcpy(arr1+2, arr1, 4); cout << arr1 << endl; return 0; }

在这里我们想从arr1起始位置拷贝4个字节到arr1+2的位置
想要得到的结果是:1 2 1 2 3 4 7 8 9
而实际的结果为:
memcpy拷贝重叠及memmove
文章图片

原因如下:
memcpy拷贝重叠及memmove
文章图片

在拷贝过程中,由于src在dst左侧,因此src内容发生改变,引起错误
解决方法:memmove
二.memmove
功能:memmove用于拷贝字节,但是目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源内容会被更改
void* my_memmove(void* dst, const void* src, size_t count) { void* ret = dst; if (dst <= src) { while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = https://www.it610.com/article/(char*)src + 1; } } else { dst = (char*)dst + count - 1; src = (char*)src + count - 1; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst - 1; src = (char*)src - 1; } } return ret; }

【memcpy拷贝重叠及memmove】运行结果:
memcpy拷贝重叠及memmove
文章图片

memmove可以解决内存拷贝重叠引起的错误问题
  • 当dst在src左侧或者在同一位置时,从前向后进行拷贝
  • 其他情况则从后向前拷贝

    推荐阅读