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;

while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
        }

return(ret);
}

void * __cdecl memmove (void * dst, const void * src, size_t count)
{
        void * ret = dst;

if (dst <= src || (char *)dst >= ((char *)src + count)) {
                //从地位向高位
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
                }
        }
        else {  //从高位向地位
                
                dst = (char *)dst + count - 1;
                src = (char *)src + count - 1;

while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst - 1;
                        src = (char *)src - 1;
                }
        }

return(ret);
}

memcpy和memmove的区别相关推荐

  1. memcpy和memmove的区别以及内存重叠问题

    memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...

  2. memcpy与memmove的区别

    memmove 和 memcopy 1.memmove 函数原型:void *memmove(void *dest, const void *source, size_t count) 返回值说明:返 ...

  3. 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数

    一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...

  4. memcpy and memmove

    12.25 memcpy() 和 memmove() 有什么区别? 如果源和目的参数有重叠, memmove() 提供有保证的行为.而 memcpy()  则不能提供这样的保证, 因此可以实现得更加有 ...

  5. strcpy,memcpy和memmove区别

    strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...

  6. 关于memcpy和memmove两函数的区别

    http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...

  7. memcpy和memmove函数的区别

    文章目录 前言 memcpy函数 memmove函数 memcmp函数 前言 c语言<string.h>库里面有很多的字符函数,比如memcpy,memmove,memcmp等,这些函数是 ...

  8. memcpy 头文件_C|memcpy()和memmove()的比较及实现

    memcpy()和memmove()函数的原型如下: void * memcpy ( void * dst, const void * src, size_t num ); void * memmov ...

  9. (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.内存函数是什么 二.内存函数的分类(常见) 1.memcpy memcpy的模拟实现 2.memmove memmov ...

最新文章

  1. 近万个Python开源项目中精选Top34!
  2. 【PHPMailer】写一封邮件
  3. 小白们应当知道的配置系统变量PATH 的小技巧。
  4. oozie的作业调度
  5. 浙江树人学院计算机专业好吗,浙江树人学院有哪些专业及什么专业好
  6. qt之qml开发优缺点_linux配置vlc-qt
  7. 【专题介绍】跨越 X 突破,音视频聚力新机遇
  8. Java命令行界面(第27部分):cli-parser
  9. Python机器学习:SVM006什么是核函数?
  10. javascript - 你不容错过的es6模板写法
  11. java求最大子数组 (分治算法)
  12. Bailian3195 最大公约数【数论】
  13. iOS NSMutableURLRequest 上传图片
  14. PHP依赖注入(DI)和控制反转(IOC)
  15. 通过网易云api实现一个简单的音乐播放器
  16. MYSQL 人民币大写金额转小写
  17. linux 如何添加字体
  18. Windows 驱动开发 新手入门(一)
  19. 清除node本地缓存
  20. opencv物体识别-识别水果

热门文章

  1. 4、已知圆的半径radius= 1.5,求其面积
  2. Guru of the Week 条款01: 变量的初始化
  3. 手把手教你在ubuntu上安装LAMP
  4. Eclipse 常用快捷键
  5. vue/cli 3.0 font-size随屏幕大小变化而变化 rem设置
  6. SpringBoot集成多数据源
  7. 大数据量高并发的数据库优化(转)
  8. 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
  9. android学习日记16--GridView(网格视图)
  10. 我也来说说Dynamic