memcopy和memmove的区别

Memcopy和memmove函数在linux下看了一下两个函数的源码。

两个函数都在头文件string.h中定义,函数原型为:

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

实现代码如下:

void * __cdecl memcpy ( void * dst,const void * src,size_t count)
{
         void * ret = dst;
         while (count--)
         { // 注意, memcpy函数没有处理dst和src区域是否重叠的问题
                   *(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))
         {
                   // 若dst和src区域没有重叠,则从起始处开始逐一拷贝
                   while (count--)
                   {
                            *(char *)dst = *(char *)src;
                            dst = (char *)dst + 1;
                            src = (char *)src + 1;
                   }
         }
         else
         { // 若dst和src 区域交叉,则从尾部开始向起始位置拷贝,这样可以避免数据冲突
                   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);
}

总结一下:

当src和dst区域没有重叠时,两个函数是完全一样的。木有重叠的条件是: dst <= src || (char *)dst >= ((char *)src + count 。否则,memcpy是不能正常工作的,memmove是可以正常工作的。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, dst
, char*
, char[]
, count
, char
, src
, memmove
, memcpy memmove
, memcpy
, cdecl
, __cdecl
, size()区别
void
memmove memcpy 区别、memmove和memcpy、memmove、memmove函数、memcpy memmove,以便于您获取更多的相关知识。

时间: 2024-04-19 16:51:05

memcopy和memmove的区别的相关文章

C++中memcpy和memmove的区别总结_C 语言

变态的命名 我们在写程序时,一般讲究见到变量的命名,就能让别人基本知道该变量的含义.memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝.那么既然memcpy和memmove二者都是内存拷贝,那二者究竟有什么区别呢? 先说memcpy 你有没有好好的参加过一场C++笔试.让你写出memcpy的实现,这是多么常见的笔试题啊.现在,拿起你的演算纸和笔;是的,是笔和纸,不是让你在你的IDE上写.写不出来?看下面吧:

memmove 和 memcpy的区别

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);  他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确. 第一种情

c++学习笔记

Fun(a++)与fun(++a) Fun(++a)很好理解了,但是Fun(a++)的执行过程呢?我开始以为相当于fun(a){a++,------}这样的话传值a不会变化,但是写了个demo才知道是相当于fun(a);a = a+1;看汇编代码,它是把a加一得操作压栈的最下面,所以执行完才会执行加一操作.   -使用typedef和预处理宏的区别是什么? Typedef和#define都可以用来对已有的数据类型赋予一个新的别名.而问题的出现是当 我们对指针这种类型的操作时. Typedefs在

C/C++中的mem函数和strcopy函数的区别和应用_C 语言

strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. memcpy提供了一般内存的复制.即memcpy对于需要复制的内容没有限制,因此用途更广. mem系列函数是面试的时候常考的知识点,我们需要熟练掌握这三个函数的原理和代码实现,要能准确无误的写出代码. memcpy.memset和memset三个函数在使用过程中,均需包含以下头文件: //在C中 #include<

mfc-LBN_SELCHANGE和LBN_DBLCLK有什么区别?

问题描述 LBN_SELCHANGE和LBN_DBLCLK有什么区别? LBN_SELCHANGE和LBN_DBLCLK有什么区别呢,我是新手,请说的详细些. 解决方案 一个在选择更改的时候触发,一个在双击的时候触发 解决方案二: msdn文档中都有,详细地自己看,或者google下

固态硬盘做系统盘和做缓存盘有什么区别

  固态硬盘做系统盘和做缓存盘有什么区别          用固态硬盘直接做缓存盘不同于直接用固态硬盘做系统盘直接在固态硬盘上读取数据,固态硬盘做缓存盘的时候是根据用户经常访问的数据,将这一部分数据保存到固态硬盘上方便下次读取的时候快速读取而已,其作用类似硬盘的内存,只不过这块内存的数据并不会伴随关机而自动清空.         推荐阅读:让SSD速度飞起来 固态硬盘优化技巧大全  因此综上所述,最立竿见影的方法就是直接将固态硬盘做系统盘,并用剩余的容量安装游戏或者其他常用软件,这样收益是最明显

[数据结构] 数组与链表的优缺点和区别

概述 数组 是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素.如果应用需要快速访问数据,很少插入和删除元素,就应该用数组. 链表 中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储 数据元素 的 数据域,另一个是存储下一个结点地址的

关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知

问题描述 关于支付系统中的同步通知和异步通知电商的区别,为什么需要通知 在电商对应的支付系统中当支付完成之后需要做相关的同步通知和异步通知操作,请大神解释一下什么是同步通知和异步通知,为什么需要同步通知和异步通知. 解决方案 同步用于即时通知支付完成 异步用于防止信息漏发漏收 解决方案二: 可以这样理解, 1.用户(买家)支付完成后,电商平台需要实时的给用户一个通知,如支付已经处理等待订单确认. 2.电商平台,这块就需要考虑系统技术方面的各个环节,考虑应对复杂多变的并发用户量.业务.流量.网络环

nil、Nil、NULL和NSNull区别

前言 记得曾经有不少朋友问过笔者,在Objective-C中nil和Nil以及NULL的区别.最重要的是,在面试中还有不少朋友常会被问到.记得当年刚找工作的时候,笔者就被面试官问到过,现在笔者在这里统一详细说明. NULL 对于学习过C/C++语言的朋友,对NULL一定很熟悉吧?这就是在C/C++中的空指针. 在C语言中,NULL是无类型的,只是一个宏,它代表空.我们不研究C++中的NULL,因为在C++11以后又有了新的定义,我们不深究. 这就是C语言中所谓的NULL(C++的定义比较复杂,这