memcpy的模拟实现

 一:memcpy函数的定义:

memcpy函数功能的解释:  

函数 memcpy source 的位置开始向后复制 num 个字节的数据到 destination 的内存位置,然后返回目的数组的起始地址。
memcpy函数要点:
1,这个函数在遇到 '\0' 的时候并不会停下来。
2,如果source和destination有任何的重叠,复制的结果都是未定义的。(只有memmove函数才能进行重叠内存的复制)
3,因为不知道我们的源头数组和目的数组的类型,所以均用void * 来接收和返回,size_t num则是确保了复制的字节数是正数。

二:memcpy函数的演示: 

1, 函数memcpyarr1的位置开始向后复制20个字节的数据到arr2的内存位置。

2, 函数memcpyarr1的位置开始向后复制21个字节的数据到arr2的内存位置。

只多了复制了一个字节,却得到了6这个整形,这是因为在vs中内存是小端存储:

//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00 06 00 00 00 

标红的06这个字节刚好是第21个字节,而它保留了6这个整形的关键部分,和arr2中的0组合起来,刚好也是06 00 00 00 。

三:memcpy的模拟实现:

a, 函数memcpyarr1的位置开始向后复制20个字节的数据到arr2的内存位置。

理解要点:

1,因为返回的是dest指向的首地址,而dest指向的地址在复制的过程之中会被改变。所以一开始void* start = dest; void*是因为不知道dest的类型。

3,while (num--);的理解在于进行逐字节的复制,而num就是我们要复制的字节数,刚好作为循环条件。

2,void* 类型的指针,不能进行指针运算和指针解引用,所以我们要将其进行强转之后再进行运算和解引用,那我们选择的强转的类型就是char*,逐字节的复制,会适用与多种类型指针的复制。所以再进行dest和src的复制,和dest和src向后移动的时候,都要先进行强转。

b, 函数memcpyarr1的位置开始向后复制21个字节的数据到arr2的内存位置。

和memcpy结果一致。 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值