memcpy函数的内存重叠问题

思路:memcpy函数其实不难写,就是将任意类型 count个字节给复制而已。但是问题主要出现在自身复制到自身的时候。假如目标位置小于初始位置+复制的字节数,那超出目标位置的内容就会被新内容覆盖,导致内存重叠。解决方法就是从后往前复制了,虽然还是会覆盖,但是不影响我们想要输出的结果了。

举个例子:我们代码里定义了char s1[]=“abcdefghi”
假如我要memcpy(s1+2,s1,5),即把s1从头开始到第五个字节的内容,复制到从s1第二个位置开始的位置
我们理想的结果当然是abcdehi,然而事实是,如果没有内存重叠处理,输出结果是ababahi
仔细想想应该能想明白原因
下面上代码:

#include 
#include 

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;
}

你可能感兴趣的:(c++,算法,数据结构)