YoungEagle

代码人生

C++博客 联系 聚合 管理
  0 Posts :: 4 Stories :: 0 Comments :: 0 Trackbacks
 1memmove、memcpy、strcpy 
 2strcpy只能处理字符串;如果拷贝带有特殊字符的串,就只能用memcpy或memmove。
 3memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。
 4
 5memcpy()和memmove()都是C语言中的库函数,在头文件string.h中,其原型分别如下:
 6
 7void *memcpy(void *dst, const void *src, size_t count);
 8void *memmove(void *dst, const void *src, size_t count);
 9
10它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。当源内存区域和目标内存区域无交叉时,两者的结果是一样的,但如果有交叉呢?先看下图: 
11
12
13
14
15图的上半部分为源内存区域在目标内存区域右边,下半部分为源内存区域在目标区域左边,源内存区域和目标内存区域都有交叉。 
16memcpy()是从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;
3110         }

3211 
3312         return(ret);
3413 }

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;
4710                         src = (char *)src + 1;
4811                 }

4912         }

5013         else {
5114                 
5215                 dst = (char *)dst + count - 1;
5316                 src = (char *)src + count - 1;
5417 
5518                 while (count--{
5619                         *(char *)dst = *(char *)src;
5720                         dst = (char *)dst - 1;
5821                         src = (char *)src - 1;
5922                 }

6023         }

6124 
6225         return(ret);
6326 }

64
65转自:http://www.cppblog.com/kenny/archive/2011/04/16/144362.html
posted on 2011-04-17 18:13 LRJ 阅读(79) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理