memcpy不能复制内存重叠区域,memmove可以拷贝重叠内存

http://blog.csdn.net/li_ning_/article/details/51418400

下面s和s2指向的内存区域有重叠,memcpy不能正确复制,src赋值给dst时,可能会修改自身的值

char s[] = "abcdefghij";
char *s2 = s + 4;
memmove(s2, s, strlen(s2)+1);//s2的最后一个未知 为'\0'字符,从s位置开始复制,不能多一个元素覆盖了结尾的‘\0'
cout << s2 << endl;//只复制strlen(s2)个字节,s2输出abcdef,strlen(s2)的值为6
cout << strlen(s2) << endl;//复制strlen(s2)+1个字节,s2结尾不是'\0',strlen(s2)的值为23

s2的位置是第4个,s是第0个,strlen(s2)的长度为efghij占用的内存空间,共五个字节

重叠分两种情况,src的位置在dst指向区域子内,dst位置在src之内;memmove的第三个参数应该不大于dst指向的内存区域长度

void *memmove(void*dst,void*src, size_t num) size_t是无符号整数

dst>src,正向拷贝,memcpy可处理;dst<src,需要反向拷贝,memcpy不能处理这种情况

 1 struct {
 2     char name[40];
 3     int age;
 4 } person, person_copy;
 5 void *Memmove(void*dst, void*src, int size_t)
 6 {
 7     if (dst == NULL || src == NULL) return NULL;
 8     
 9     //正向逐字节拷贝,反向逐字节拷贝,没有检测要拷贝的字节数超出dst指向的内存区域;dst=src,什么也不做
10     if (dst < src) {
11         char *p = (char*)(dst);
12         char *q = (char*)(src);
13         while (size_t)
14         {
15             *p++ = *q++;
16             size_t--;
17         }
18     }
19     if (dst > src){
20         char *p = (char*)(dst)+size_t - 1;
21         char *q = (char*)(src)+size_t - 1;
22         while (size_t)
23         {
24             *p-- = *q--;
25             size_t--;
26 
27         }
28     }
29     
30     
31     return dst;
32 }
33 
34 int main()
35 {
36     char s[] = "abcdefghij";
37     char *s2 = s + 4;
38     memmove(s2, s, strlen(s2));//s2的最后一个未知 为'\0'字符,从s位置开始复制,不能多一个元素覆盖了结尾的‘\0'
39     cout << s2 << endl;//只复制strlen(s2)个字节,s2输出abcdef,strlen(s2)的值为6
40     cout << strlen(s2) << endl;//复制strlen(s2)+1个字节,s2结尾不是'\0',strlen(s2)的值为23
41     char *s3 = s + 2;
42     cout << s << endl;
43     memmove(s3, s2, strlen(s3));
44     cout << s3 << endl;
45     cout << s << endl;
46     return 0;
47 }
48 //int main()
49 //{
50 //    int i = 0;
51 //    int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
52 //    int arr2[10] = { 0 };
53 //    int arr3[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
54 //    cout << sizeof(arr1) << endl;
55 //    Memmove(arr2, arr1, sizeof(arr1));
56 //    Memmove(arr3 + 5, arr3 + 4, 3 * sizeof(int));
57 //    for (i = 0; i < 10; i++)
58 //    {
59 //        printf("%d ", arr2[i]);
60 //    }
61 //    printf("\n");
62 //    for (i = 0; i < 10; i++)
63 //    {
64 //        printf("%d ", arr3[i]);
65 //    }
66 //    system("pause");
67 //    return 0;
68 //}

 

posted @ 2017-09-30 20:57  hchacha  阅读(921)  评论(0)    收藏  举报