user-0 提问: C语言中momcpy不是不能处理内存重叠问题吗？为什么VS，linux库中的momcpy可以

回复:
user: user-1
content: 嗯。。。。。。。。我也遇到了这个问题

user: user-0
content: 引用 4 楼 xiaohuh421的回复:你想说的是memcpy吗 memcpy本身都不能处理重叠的吧 第一次用，没粘代码

user: user-0
content: memcpy本质就是不能处理内存重叠，而memmove可以处理内存重叠，我就很郁闷，系统的momcpy为什么可以处理。 The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original  source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions. 这个是在msdn上对memcpy函数的解释

user: user-0
content: #include<stdio.h> #include<string.h> void *my_memcpy(void *dest,const void *src,size_t count) { 	void *p = dest; 	assert(dest); 	assert(src); 	while(count--) 	{ 		*(char*)p = *(char*)src; 		p = (char *)p +1; 		src = (char*)src +1; 	} 	return dest; } int main() {         char arr[10] ="123456";         printf("%d\n",memcpy(arr+1,arr,5));//???? 	printf("%d",my_memcpy(arr+1,arr,5));//????? 	return 0; }

user: user-2
content: 你想说的是memcpy吗 memcpy本身都不能处理重叠的吧

user: user-3
content: 不知道你在你的模拟函数中有没有判断内存重叠的情况 比例  Mymemcpy(P_A, P_B, Len)  /	//判断 P_A在 P_B 的前面还是后面 	//P_A和P_B首地址一样 	if（P_A == P_B） 	{ 		//截取你要Len个值 	} 	// P_A在 P_B 后面 	else if（P_A > P_B） 	{ 		//没有重叠 		if(P_A  - P_B > Len) 		{ 			//循环一个个复制或者一块复制 		} 		//有重启 		else 		{ 			//循环一个个复制 		}       } 	 // P_A在 P_B前面 	 else 	 { 		 //没有重叠 		 if(P_B  - P_A > Len) 		 { 			 //循环一个个复制或者一块复制 		 } 		 //有重叠 		 else 		 { 			 //循环一个个复制 		 }  	}

user: user-4
content: 建议将你的模拟mmecpy的代码贴出来；

user: user-5
content: 把代码和用例贴出来

user: user-4
content: 引用 8 楼 zhao4zhong1 的回复:先弄清楚copy和move的语义： copy的语义是操作结束后，新目的的内容和旧源的内容一致，且保证旧源的内容不变。 move的语义是操作结束后，新目的的内容和旧源的内容一致，但不保证旧源的内容不变。 于是乎，当操作的内存重叠时，无论如何也不可能实现copy！ 赵老师的这几句话还是能够回答你的问题的；

user: user-4
content: #include<stdio.h> #include<string.h> #include <assert.h>  void *my_memcpy(void *dest, const void *src, size_t count) { #if 1     char *d = (char *)dest;     char *s = (char *)src;      while (count--) {         printf("%c", *s);         printf("%p\n", s);         *d++ = *s++;     }  #else      void *p = dest;     assert(dest);     assert(src);     while(count--)     {         *(char*)p = *(char*)src;         p = (char *)p +1;         src = (char*)src +1;     } #endif     return dest; } int main() {     char arr[10] ="123456";    /* for my_memecpy */     char arr1[10] ="123456";    /* for memcpy*/      puts(arr);     printf("arr = %p\n", arr);     printf("arr+1 = %c\n", *(arr+1));     printf("%s\n", (char *)my_memcpy(arr + 1, arr, 5));     puts(arr);     //printf("%s\n", (char *)memcpy(arr1 + 1, arr1, 5));      return 0; } 这样是不能完成内部拷贝的。 你看一下memecpy的输出结果也不是正确的内部拷贝结果； 只有memmove能够实现内部拷贝；  #include<stdio.h> #include <stdlib.h> #include<string.h> #include <assert.h>  void *my_memmove(void *dest, const void *src, size_t count) { #if 1     int tmp_len = count;     char *tmp = (char *)malloc(sizeof(char) * tmp_len);     if (!tmp)         return NULL;     char *p = tmp;     char *d = (char *)dest;     char *s = (char *)src;      while (count--) {         *p++ = *s++;     }      p = tmp;     while (tmp_len--)         *d++ = *p++;      free(tmp); #else      void *p = dest;     assert(dest);     assert(src);     while(count--)     {         *(char*)p = *(char*)src;         p = (char *)p +1;         src = (char*)src +1;     } #endif     return dest; } int main() {     char arr[10] ="123456";    /* for my_memecpy */     char arr1[10] ="123456";    /* for memcpy*/      printf("my_memcpy: %s\n", (char *)my_memmove(arr + 1, arr, 5));     puts(arr);     printf("memecpy: %s\n", (char *)memcpy(arr1 + 1, arr1, 5));     puts(arr1);      return 0; }

user: user-6
content: 先弄清楚copy和move的语义： copy的语义是操作结束后，新目的的内容和旧源的内容一致，且保证旧源的内容不变。 move的语义是操作结束后，新目的的内容和旧源的内容一致，但不保证旧源的内容不变。 于是乎，当操作的内存重叠时，无论如何也不可能实现copy！