资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

c语言函数memmove,C语言函数调用

C语言,请问memmove与memcpy的作用有什么区别?

唯一的区别在于操作的源和目的

成都创新互联公司为企业级客户提高一站式互联网+设计服务,主要包括成都网站制作、成都网站设计、外贸营销网站建设重庆APP开发公司微信小程序、宣传片制作、LOGO设计等,帮助客户快速提升营销能力和企业形象,创新互联各部门都有经验丰富的经验,可以确保每一个作品的质量和创作周期,同时每年都有很多新员工加入,为我们带来大量新的创意。 

用memmove,源和目的可以是同一块内存区域

用memcpy,源和目的不能是同一块内存区域

比如int

a[10]={1,2,3,4,5,6,7,8,9,0};memmove(a[2],a[5],2);是正确的

memcpy与memmove的区别

memcpy和memmove都是C语言的库函数,相比于strcpy和strncpy只能拷贝字符串数组,memcpy与memmove可以拷贝其它类型的数组,但是为什么要同时提供两种方法呢?本文主要就是介绍这两个函数的区别。

首先来看函数原型:

这两个函数都是将s2指向位置的n字节数据拷贝到s1指向的位置,区别就在于关键字restrict, memcpy假定两块内存区域没有数据重叠,而memmove没有这个前提条件。如果复制的两个区域存在重叠时使用memcpy,其结果是不可预知的,有可能成功也有可能失败的,所以如果使用了memcpy,程序员自身必须确保两块内存没有重叠部分。

我们来看一组示例:

正常情况下,即使内容有重叠,src的内容也可以正确地被拷贝到了dest指向的空间。

这种情况下,src的地址小于dest的地址,拷贝前3个字节没问题,但是拷贝第4,5个字节时,原有的内容已经被src拷贝过来的字符覆盖了,所以已经丢失原来src的内容,这很明显就是问题所在。

一般来说,memcpy的实现非常简单,只需要顺序的循环,把字节一个一个从src拷贝到dest就行:

memmove会对拷贝的数据作检查,确保内存没有覆盖,如果发现会覆盖数据,简单的实现是调转开始拷贝的位置,从尾部开始拷贝:

这里 __np_anyptrlt 是一个简单的宏,用于结合拷贝的长度检测dest与src的位置,如果dest和src指向同样的对象,且src比dest地址小,就需要从尾部开始拷贝。否则就和memcpy处理相同。

但是实际在C99实现中,是将内容拷贝到临时空间,再拷贝到目标地址中:

由此可见memcpy的速度比memmove快一点,如果使用者可以确定内存不会重叠,则可以选用memcpy,否则memmove更安全一些。另外一个提示是第三个参数是拷贝的长度,如果你是拷贝10个double类型的数值,要写成sizeof(double)*10,而不仅仅是10。

从c语言中 memmove()在哪个头文件里

$ man memmove

MEMMOVE(3) Linux Programmer’s Manual MEMMOVE(3)

NAME

memmove - copy memory area

SYNOPSIS

#include string.h

void *memmove(void *dest, const void *src, size_t n);

DESCRIPTION

The memmove() function copies n bytes from memory area src to memory area dest. The

memory areas may overlap.

RETURN VALUE

The memmove() function returns a pointer to dest.

CONFORMING TO

SVr4, 4.3BSD, C99.

SEE ALSO

bcopy(3), memccpy(3), memcpy(3), strcpy(3), strncpy(3), wmemmove(3)

c语言中memmove函数如何实现?

这个就使用系统的呗,和memcpy差不多,系统是用汇编写的,效率高些。

思路和memcpy一样,就是两个指针对考数据呗,完了把移动前的数据置0就行了。


当前文章:c语言函数memmove,C语言函数调用
网页地址:http://cdkjz.cn/article/hssdis.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

业务热线:400-028-6601 / 大客户专线   成都:13518219792   座机:028-86922220