实现函数strcpy/memcpy/memmove

马谦马谦马谦 2019年9月8日16:15:26 发表评论
文章最后编辑于:2019-12-8 16:33:33

一、strcpy

strcpy是字符串拷贝函数,将一个字符串拷贝到另一个字符串。

代码:

实现该函数的注意点:

  1. 传入参数src使用const修饰,避免函数内部修改数据。
  2. 使用p备份dst指针,在拷贝完成之后返回该值。
  3. 需要判断传入参数的合法性,避免出现不合理输入。
  4. 注意判断拷贝完成的标准是src[i] == '\0','\0'也要拷贝到dst字符串中。
  5. 返回拷贝完成的值,更好的支持链式表达式。

高级:

上面的实现是没有区分内存重叠的场景,假设源目地址存在重叠,使用上面的函数实现是有问题的。如图所示:

实现函数strcpy/memcpy/memmove

dst和src都是指向同一个数组,当把src的第三个元素赋值到dst后,src原有的'\0'被覆盖了,后续继续拷贝就出现问题。

解决这个问题其实很简单,只要从后往前复制src即可解决这个问题。可参考下面memcpy的实现。

二、memcpy

memcpy的作用是把一块内存区域拷贝到另外一个内存地址上面去。

实现:

需要注意的点:

  1. src使用const修饰,count设置成无符号类型。
  2. 判断传入参数的有效性,避免无效输入。
  3. 判断源目地址相等的情况。
  4. 目的地址大于源地址,从高位向地位复制,避免出现内存重叠的问题。
  5. 目的地址小于源地址,从低位向高位复制。
  6. 返回复制好的目的地址指针以支持链式表达式。

三、memmove

memmove的作用是把一块内存空间的内容移动到另一个内存空间,实现方法和上面的memcpy一致。

本文共执行64次查询,耗时0.595秒!
马谦马谦马谦

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: