思路:memcpy函数其实不难写,就是将任意类型 count个字节给复制而已。但是问题主要出现在自身复制到自身的时候。假如目标位置小于初始位置+复制的字节数,那超出目标位置的内容就会被新内容覆盖,导致内存重叠。解决方法就是从后往前复制了,虽然还是会覆盖,但是不影响我们想要输出的结果了。
举个例子:我们代码里定义了char s1[]=“abcdefghi”
假如我要memcpy(s1+2,s1,5),即把s1从头开始到第五个字节的内容,复制到从s1第二个位置开始的位置
我们理想的结果当然是abcdehi,然而事实是,如果没有内存重叠处理,输出结果是ababahi
仔细想想应该能想明白原因
下面上代码:
#include <iostream>
#include <assert.h>
void * memcpy(void* s1,const void *s2,size_t count){
assert(s1!=nullptr&&s2!=nullptr);
char *p1=(char *)s1;
const char *p2=(const char *)s2;
if(p1>p2&&p1<p2+count){
p1=p1+count-1;
p2=p2+count-1;
while(count--){
*p1--=*p2--;
}
}
else{
while(count--){
*p1++=*p2++;
}
}
return s1;
}
int main(){
char s1[]="abcdefghi";
std::cout<<(char*)memcpy(s1+2,s1,5)<<std::endl;
system("pause");
return 0;
}