实现memcpy函数主要考虑内存重叠问题。
因为dst的内存起始地址可能处在src+length所在的内存范围内,所以需要对不同的情况进行区分
1.对于dst <src和dst>src+length二种情况下不存在内存重叠问题,所以直接拷贝
2.对于内存重叠,需要从后端拷贝,这样dst是不会覆盖还未拷贝的src数据。
#include<iostream> using namespace std; void * my_memcpy(char *dst,const void *src, int length) { if (src == nullptr || length <= 0)//边界值判断 return nullptr ; char *d = nullptr; char *s = nullptr; if (dst < src || dst > ((char*)src + length))//没有重叠 { s = (char *)src; d = (char *)dst; while (length--) { *d = *s; s++; d++; } } else//内存重叠 { s = (char*)src + length - 1; d = (char*)dst + length - 1; while (length--) { *d = *s; s--; d--; } } return d; } void main() { char a[10]; char *p = "11111111"; my_memcpy(a, p, 10); cout << a << endl; }