#includevoid 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 912 3 4 5 6 7 8 9123 4 5 7 8 9 //6没了1234 5 7 8 912345 7 8 912345 8 9 //7没了12345 8 9123458 99 //多了一个912345899但是根据网上搜到的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;0809 if (n) {10 n++;11 while (--n > 0) {12 *p1++ = *p2++;13 }14 }15 return s1;16 }究竟是怎么回事?是内存重叠的问题吗?望高手不吝赐教。又试了几遍,在pc机上无论是windows还是linux下编译运行一切正常,在服务器上(CPU为Xeon E5-2600)编译运行会出现此问题。
1 回答
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
1 2 3 4 5 6 7 8 9
12 3 4 5 6 7 8 9
123 4 5 6 7 8 9
1234 5 6 7 8 9
12345 6 7 8 9
123456 7 8 9
1234567 8 9
12345678 9
123456789
CentOS测试。
童鞋,别测试了。不同系统下的实现是不完全一样的。出现这种错误情况,说明在这个系统下此函数这么用就会出错。想避免出错就需要避免用这种写法。
添加回答
举报
0/150
提交
取消