memcpy memmove 2

前面文章问题继续,之所以2个函数效果一样,我怀疑是编译器的问题,或者库函数已经对memcpy做了修改。如果按照

void *memcpy1(void* dest,void* src,size_t size) 
 { 
        char* tmpDest = (char*)dest;  //取首地址
        char* tmpSrc = (char*)src; //取首地址
        while(size--) 
            *tmpDest++=*tmpSrc++; 
         return dest; 
}
uint8_t arr[5] = {1,2,3,4,5};
int main(void)
{
    G_print(arr,5);
    memcpy1(&arr[2],&arr[1],3);
    G_print(arr,5);
    return 1;
}

这样的库函数测试的话 结果是:

01 02 03 04 05 
01 02 02 02 02 
[Finished in 0.8s]

参考:https://mp.weixin.qq.com/s/2ZJ0WVDrao_3AuyQznmefA

   strcpy和memcpy都是标准库c的函数; 

    strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且还会复制字符串的结束符'\0'。

    原型:char* strcpy(char* dest,const char* src); 

   memcpy提供了内存的复制。即对于复制的内容没有限制,因此用途更广。

    原型: void* memcpy(void* dest,const void* src,size_t size);

   实现strcpy 

   

    char* strcpy(char* dest,const char* src)
    { 
        assert(dest!=NULL&&src!=NULL); 
        char* tmp = dest;  //取首地址
        while((*dest++=*src++)!='\0'); 
        return tmp; 
    }

实现memcpy

 void *memcpy(void* dest,void* src,size_t size) 
 { 
        assert(dest!=NULL&&src!=NULL); 
        char* tmpDest = (char*)dest;  //取首地址
        char* tmpSrc = (char*)src; //取首地址
        while(size--) 
            *tmpDest++=*tmpSrc++; 
         return dest; 
}

 

另外memcpy有一个缺点,无法处理内存重叠的问题,(当src首地址在dest首地址之前,且src和dest有内存重叠的部分,memcpy会出现提前覆盖src和dest重叠的内存)

memmove也是c语言的库函数,和memcpy唯一的区别就是当内存发生重叠时,可以保证src在被覆盖之前将重叠区域的字节拷贝到目标区域中。

实现memmove

void *memmove(void* dest,void* src,size_t size)
{
    assert(dest!=NULL&&src!=NULL);
    char* tmpDest = (char*)dest; //取首地址
    char* tmpSrc = (char*)src; //取首地址
    if(tmpSrc<tmpDest && tmpSrc+size>tmpDest)
    {
        tmpDest = tmpDest+size-1;//首地址改为尾地址
        tmpSrc = tmpSrc+size-1;//首地址改为尾地址
        while(size--)
            *tmpDest-- = *tmpSrc--; //倒着复制
    }
    else
    {
        while(size--)
            *tmpDest++=*tmpSrc++;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值