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 //}

浙公网安备 33010602011771号