memcpy函数的内存重叠问题

思路: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值