c语言拷贝函数之memcpy与memmove
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可知,两个函数间参数几乎
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:运行结果

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




所有评论(0)