YoungEagle
代码人生
C++博客
联系
聚合
管理
0 Posts :: 4 Stories :: 0 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
C++(3)
Linux
Windows
调试技术
逆向工程
网络安全
网络编程
文章档案
2011年5月 (1)
2011年4月 (3)
搜索
最新评论
memmove、memcpy、strcpy
1
memmove、memcpy、strcpy
2
strcpy只能处理字符串;如果拷贝带有特殊字符的串,就只能用memcpy或memmove。
3
memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。
4
5
memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下:
6
7
void
*
memcpy(
void
*
dst,
const
void
*
src, size_t count);
8
void
*
memmove(
void
*
dst,
const
void
*
src, size_t count);
9
10
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果是一样的,但如果有交叉呢?先看下图:
11
12
13
14
15
图的上半部分为源内存区域在目标内存区域右边,下半部分为源内存区域在目标区域左边,源内存区域和目标内存区域都有交叉。
16
memcpy()是从src的起始部分开始复制,所以虽然第一种情况下没有问题,但如果遇到第二种情况,则会发生错误,如图所示,后两个字节在被复制前已经被覆盖掉了。而memmove()则由于采用了不同的复制机制,所以可以正确处理第二种情况。
17
18
19
下面是两个函数的源码实现:
20
21
22
23
1
void
*
__cdecl memcpy (
void
*
dst,
const
void
*
src, size_t count)
24
2
{
25
3
void
*
ret
=
dst;
26
4
27
6
while
(count
--
)
{
28
7
*
(
char
*
)dst
=
*
(
char
*
)src;
29
8
dst
=
(
char
*
)dst
+
1
;
30
9
src
=
(
char
*
)src
+
1
;
31
10
}
32
11
33
12
return
(ret);
34
13
}
35
36
37
38
1
void
*
__cdecl memmove (
void
*
dst,
const
void
*
src, size_t count)
39
2
{
40
3
void
*
ret
=
dst;
41
4
42
5
if
(dst
<=
src
||
(
char
*
)dst
>=
((
char
*
)src
+
count))
{
43
6
44
7
while
(count
--
)
{
45
8
*
(
char
*
)dst
=
*
(
char
*
)src;
46
9
dst
=
(
char
*
)dst
+
1
;
47
10
src
=
(
char
*
)src
+
1
;
48
11
}
49
12
}
50
13
else
{
51
14
52
15
dst
=
(
char
*
)dst
+
count
-
1
;
53
16
src
=
(
char
*
)src
+
count
-
1
;
54
17
55
18
while
(count
--
)
{
56
19
*
(
char
*
)dst
=
*
(
char
*
)src;
57
20
dst
=
(
char
*
)dst
-
1
;
58
21
src
=
(
char
*
)src
-
1
;
59
22
}
60
23
}
61
24
62
25
return
(ret);
63
26
}
64
65
转自:
http://www.cppblog.com/kenny/archive/2011/04/16/144362.html
posted on 2011-04-17 18:13
LRJ
阅读(79)
评论(0)
编辑
收藏
引用
所属分类:
C++
只有注册用户
登录
后才能发表评论。
相关文章:
清除字符串中的空格
标准C++的一些约定
memmove、memcpy、strcpy
网站导航:
博客园
博客园最新博文
博问
管理
Powered by:
C++博客
Copyright © LRJ