1. 先看函数原型

 memcpy(void * __restrict__ _Dst,const void * __restrict__ _Src,size_t _Size)
memmove(void *_Dst,const void *_Src,size_t _Size)
_Dst 拷贝的目标地址
_Src 拷贝的源地址
_Size 拷贝的数据长度,以字节为单位

2:区别分析

    由上面1可知,两个函数间参数几乎没有区别,唯一的差别仅有__restrict__ 关键字指出。
    __restrict__介绍:restrict是c99标准引入的,它只可以用于限定和约 束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改。
    函数使用:这两个函数均从s2指向的位置复制n字节到s1指向位置,且返回均为s1的值。两者间的差别由关键字restrict造成,即memcpy()可以假定两个区域之间没有重叠。memmove()函数则不作这个假定,因此,复制过程类似与首先将所有字节复制到一个临时缓冲区,然后在复制到最终目的地。如果两个区域存在重叠时使用memcpy()时会怎样呢?其行为是不可预知的,即可能正常工作,也可能失败。--------------------①

3:复制过程呈现:

    在这里我推荐一篇博客,将两个函数的拷贝函数讲解的非常深入仔细,在这里我也感谢这边博客的发文者,给我在理解上也带来了很大的收获:

链接:https://www.cnblogs.com/luoquan/p/5265273.html

4:代码测试:

#include<stdio.h>
#include<string.h>
int main(void)
{
    int a[8]={1,2,3,4,5,6,7,8};
    int *pt1=a;
    int *pt2=a+3;
    memcpy(pt2,pt1,5*sizeof (int));
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
     printf("\n");
    int a1[8]={1,2,3,4,5,6,7,8};
    memcpy(pt1,pt2,5*sizeof (int));
    for(int i=0;i<8;i++)
        printf("%d ",a1[i]);
    printf("\n");


    int a3[8]={1,2,3,4,5,6,7,8};
    memmove(a3+3,a3,5*sizeof (int));
    for(int i=0;i<8;i++)
        printf("%d ",a3[i]);
     printf("\n");
    int a4[8]={1,2,3,4,5,6,7,8};
    memmove(a4,a4+3,5*sizeof (int));
    for(int i=0;i<8;i++)
        printf("%d ",a4[i]);
    printf("\n");


}

5:运行结果

![结果:](https://img-blog.csdnimg.cn/20201111145600421.png#pic_center)

注意:在1处指出,使用memcpy拷贝重叠时有可能成功,也有可能失败,其结果是未知的,在这里恰巧其结果正确,但不保证在其他机器上运行也成功。

Logo

一站式 AI 云服务平台

更多推荐