求指教关于memcpy()函数内存重叠问题

#include
void func(char *str)
{
char *p = str;
printf("%s\n",str);
while(*p != '\0')
{
if(*p == ' ')
{
memcpy(p,p+1,strlen(p+1)+1);
p--;
printf("%s\n",str);
}
p++;
}
}
int main(int argc , char *argv[])
{
char str[] = "1 2 3 4 5 6 7 8 9";
func(str);
return 0;
}
将字符串中的空格去掉,使用memmove函数不会出问题,但用memcpy则会出现问题,每次调用的结果是:
1 2 3 4 5 6 7 8 9
12 3 4 5 6 7 8 9
123 4 5 7 8 9 //6没了
1234 5 7 8 9
12345 7 8 9
12345 8 9 //7没了
12345 8 9
123458 99 //多了一个9
12345899
但是根据网上搜到的memcpy函数实现过程,自己重写的memcpy,调用后的结果一切正常。
网上搜到的memcpy函数实现,据此重写的memcpy函数调用结果正常:
04 void *memcpy(void *s1, const void *s2, register size_t n)
05 {
06 register char *p1 = s1;
07 register const char *p2 = s2;
08
09 if (n) {
10 n++;
11 while (--n > 0) {
12 *p1++ = *p2++;
13 }
14 }
15 return s1;
16 }
究竟是怎么回事?是内存重叠的问题吗?望高手不吝赐教。
又试了几遍,在pc机上无论是windows还是linux下编译运行一切正常,在服务器上(CPU为Xeon E5-2600)编译运行会出现此问题。

小唯快跑啊
浏览 187回答 1
1回答

素胚勾勒不出你

1 2 3 4 5 6 7 8 912 3 4 5 6 7 8 9123 4 5 6 7 8 91234 5 6 7 8 912345 6 7 8 9123456 7 8 91234567 8 912345678 9123456789CentOS测试。童鞋,别测试了。不同系统下的实现是不完全一样的。出现这种错误情况,说明在这个系统下此函数这么用就会出错。想避免出错就需要避免用这种写法。
打开App,查看更多内容
随时随地看视频慕课网APP