打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
memmove 和 memcpy的区别
邢孟哲图书馆
>《课题编程》
2014.08.07
关注
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不保证拷贝的结果的正确。
第一种情况下,拷贝重叠的区域不会出现问题,内容均可以正确的被拷贝。
第二种情况下,问题出现在
右边的两个字节,这两个字节的原来的内容首先就被覆盖了
,
而且没有保存。所以接下来拷贝的时候,拷贝的是已经被覆盖的内容
,显然这是有问题的。
实际上,
memcpy只是memmove的一个子集
。
二者的c语言实现很简单,有兴趣的朋友可以去看看。在实际情况下,这两个函数都是用汇编实现的。
memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,
但memcopy比memmove的速度要快一些
,如:
char s[] = "1234567890";
char* p1 = s;
char* p2 = s+2;
memcpy(p2, p1, 5)与memmove(p2, p1, 5)的结果就可能是不同的,memmove()可以将p1的头5个字符"12345"正确拷贝至p2,而memcpy()的结果就不一定正确了
memcpy()、 memmove()和memccpy()
-------------------------------------------------------
这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。
原型:extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制不多于count个字节到dest所指内存区域,如果遇到字符ch则停止复制。
说明:返回指向字符ch后的第一个字符的指针,如果src前n个字节中不存在ch则返回NULL。ch被复制。
char s[]="Goldenx Global View";
char d[20];
char *p;
p=(char *)memccpy(d,s,'x',strlen(s));
if(p)
{
*p='\0'; // MUST Do This
printf("Char found: %s.\n",d);
}
else
printf("Char not found.\n");
关于memmove的实现:
点击(
此处
)折叠或打开
void
*
mymemmove
(
void
*
dest
,
const
void
*
src
,
size_t n
)
{
char temp
[
n
]
;
int
i
;
char
*
d
=
dest
;
const
char
*
s
=
src
;
for
(
i
=
0
;
i
<
n
;
i
+
+
)
temp
[
i
]
=
s
[
i
]
;
for
(
i
=
0
;
i
<
n
;
i
+
+
)
d
[
i
]
=
temp
[
i
]
;
return dest
;
}
关于memcpy的实现:
点击(
此处
)折叠或打开
void
*
mymemcpy
(
void
*
dest
,
const
void
*
src
,
size_t n
)
{
char
*
d
=
dest
;
const
char
*
s
=
src
;
int
*
di
;
const
int
*
si
;
int
r
=
n
%
4
;
while
(
r
-
-
)
*
d
+
+
=
*
s
+
+
;
di
=
(
int
*
)
d
;
si
=
(
const
int
*
)
s
;
n
/
=
4
;
while
(
n
-
-
)
*
di
+
+
=
*
si
+
+
;
return dest
;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
strcpy,memcpy,memmove,memset,strncpy
1.?字符串操作函数
mem.h函数库
NO.37 ----C语言库函数中字符串相关函数的模拟实现
字符串库函数strcpy strcmp strstr memcpy memmove等的实现
memcopy和memmove 区别(另strcpy(), strncpy()和memset()) 收藏
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×