博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcpy和memmove的区别
阅读量:7225 次
发布时间:2019-06-29

本文共 1867 字,大约阅读时间需要 6 分钟。

memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下:
 

void *memcpy(void *dst, const void *src, size_t count);

void *memmove(void *dst, const void *src, size_t count);

 
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果是一样的,但如果有交叉呢?先看下图:
 

图的上半部分为源内存区域在目标内存区域右边,下半部分为源内存区域在目标区域左边,源内存区域和目标内存区域都有交叉。

memcpy()是从src的起始部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,如图所示,后两个字节在被复制前已经被覆盖掉了。而memmove()则由于采用了不同的复制机制,所以可以正确处理第二种情况。

VS.NET2003中所附源码如下(有删):

void * __cdecl memcpy (void * dst, const void * src, size_t count)

{
        void * ret = dst;
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
        }
        return(ret);
}

 

1 void * __cdecl memmove (void * dst, const void * src, size_t count) 2 { 3         void * ret = dst; 4  5         if (dst <= src || (char *)dst >= ((char *)src + count)) { 6                 /* 7                  * Non-Overlapping Buffers 8                  * copy from lower addresses to higher addresses 9                  */10                 while (count--) {11                         *(char *)dst = *(char *)src;12                         dst = (char *)dst + 1;13                         src = (char *)src + 1;14                 }15         }16         else {17                 /*18                  * Overlapping Buffers19                  * copy from higher addresses to lower addresses20                  */21                 dst = (char *)dst + count - 1;22                 src = (char *)src + count - 1;23 24                 while (count--) {25                         *(char *)dst = *(char *)src;26                         dst = (char *)dst - 1;27                         src = (char *)src - 1;28                 }29         }30 31         return(ret);32 }

 

本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/archive/2013/04/26/3045794.html,如需转载请自行联系原作者

你可能感兴趣的文章
TopN算法与排行榜
查看>>
lucene排序算法之向量空间模型(一)
查看>>
新浪微博数据Json格式解析
查看>>
WLAN 802.11 wifl区别
查看>>
oracle授权动态视图权限给用户
查看>>
Debian – 出现-bash: pip: command not found错误解决办法
查看>>
Zxing扫描二维码
查看>>
我的友情链接
查看>>
aspcms后台拿shell漏洞(非添加模块)及修复方法
查看>>
C语言冒泡排序法
查看>>
B2B行业门户网站群发邮件时间及发送频率
查看>>
关于虚拟机能ping通物理机,而物理机ping不通虚拟机问题解决。
查看>>
同台机器启动多个mysql
查看>>
iframe 跨域高度自适应
查看>>
struts2+hibernate3+spring3(ssh2)框架下的web应用
查看>>
Linux下的三个时间属性
查看>>
semanage
查看>>
[case分享]Exchange 2010 登陆OWA查看邮件出现Rights managem operation failed
查看>>
linux dd 读取 写入磁盘速度
查看>>
dmidecode查看linux硬件信息
查看>>