下面的代码片段显示了memmove()的实现。
void my_memmove(void* dest, const void* src, size_t size)
{
unsigned int i;
char* d = (char*)dest;
char* s = (char*)src;
if( s > d )
{
for( i = 0; s[i] && i < size; ++i )
d[i] = s[i];
}
else
for( i = size-1; d[i] && i >= 0; --i )
d[i] = s[i];
}
int main()
{
char my_str[] = "abcdefgh";
char str[] = "abcdefgh";
my_memmove(my_str+1, my_str, 4);
memmove(str+1, str, 4);
printf("%s %s\n", my_str, str);
return 0;
}我得到的output是:
aabcdfgh 为什么my_memmove()不能正常工作(它更改了my_str以便输出空字符串)?
发布于 2012-08-20 21:09:01
对于无符号整数,条件i >= 0始终为真。最好编写带有"-1“反转偏差的惯用循环:
for (i = 0; i != size; ++i)
d[size - i - 1] = s[size - i - 1];此外,附加条件s[i] &&看起来显然是错误的。
发布于 2013-01-29 13:21:42
您假设src和dest指向相同内存块中的点。
...
char* d = (char*)dest;
char* s = (char*)src;
if( s > d )
...这意味着如果有人使用src和dest指向内存中的两个不同位置来调用你的函数,你将得到未定义的行为。
这是非常非常糟糕的,只要使用内置的memmove()即可。
https://stackoverflow.com/questions/12038269
复制相似问题