memcpy函数_128.实现 memcpy 函数

每天一个开发小知识。面试中,我们可能遇到过让你实现 memcpy 函数。首先,你得知道 memcpy 函数是干什么的吧。memcpy 函数是内存拷贝函数,函数原型为:
void * memcpy(void * dest, void * src, unsigned int n);
实现的功能是从源(src)内存地址的起始位置开始,拷贝 n 个字节到目标(dest)内存地址。核心代码很简单,就是两个指针之间的赋值,然后同时向后移动。
*dest++ = *src++;
但是,我们需要注意两点:
  1. 两个指针可能不是同一数据类型,这样就不能保证它们自增(++)时,往后移动的字节数是一样的,所以,需要先将它们强制转换成 char *,再向后移动;

  2. 存在内存重叠的可能,如下图,src 指向的数据存放在内存地址为 [10001,10101] 的范围内,dest 指向的地址刚好落在这个范围内,如果还是按上面的语句赋值,会发生数据覆盖的情况。

322b6b356d4a7f6c6d2a146cc276819c.png

我们可以通过从后往前拷贝数据,解决内存重叠问题。最终代码如下:
void * memcpy(void * dest, const void * src, unsigned int count){    if (NULL== dest || NULL == src || 0 == count)    {        return NULL;    }    char * d;    const char * s;    if (dest > (src + count) || dest < src)    {        d = (char *)dest;        s = (char *)src;        while (count--)        {            *d++ = *s++;        }    }    else    {        d = (char *)(dest + count - 1);        s = (char *)(src + count - 1);        while (count--)        {            *d-- = *s--;        }    }    return dest;}
每天一个开发小知识,今天你学废了吗?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值