首页 > 其他 > 详细

memcpy的实现

时间:2019-10-06 23:21:51      阅读:90      评论:0      收藏:0      [点我收藏+]

按字节(Byte)拷贝实现的memcpy

技术分享图片
 1 void *my_memcpy_byte(void *dst, const void *src, int n)
 2 {
 3     if (dst == NULL || src == NULL || n <= 0)
 4         return NULL;
 5 
 6     char * pdst = (char *)dst;
 7     char * psrc = (char *)src;
 8 
 9     if (pdst > psrc && pdst < psrc + n)
10     {
11         pdst = pdst + n - 1;
12         psrc = psrc + n - 1;
13         while (n--)
14             *pdst-- = *psrc--;
15     }
16     else
17     {
18         while (n--)
19             *pdst++ = *psrc++;
20     }
21     return dst;
22 }
技术分享图片

在上面按字节拷贝中考虑了拷贝覆盖,连续的一段空间存放数据是从低地址到高地址进行存放。先从源地址读出数据,然后写入到目的地址空间中。目的空间的起始地址如果在源数据空间之内就会出现内存覆盖的情况。

这种情况先从尾部拷贝,避免覆盖数据,不过这种情况也会破坏src空间数据,src前使用了const关键字,也就是空间只读,在函数内部不修改src空间数据。

而标准库的memcpy并没有将写覆盖认为是内存拷贝,而是内存移动。memcpysrc代表一块内存空间,并用const关键字修饰,并不希望内存块被破坏。

对于写覆盖(这里是内存块移动)标准库推荐使用memmove函数。

memcpy的实现

原文:https://www.cnblogs.com/liangyc/p/11628723.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!