【发布时间】:2012-08-20 13:06:16
【问题描述】:
下面的代码sn-p显示了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 使其输出空字符串)?
【问题讨论】:
-
这必须是家庭作业,因为这是迄今为止该问题的第二份副本。同时,你到底为什么要在这里比较 > 或
-
另外,为什么用
s[i]进行空检查?你已经有了尺码。 -
@bmargulies 它会影响循环的方向。 memmove 必须防止内存重叠。
-
使用 s[i] 进行空值检查来处理过大的尺寸。如果 size 是 50 怎么办?
-
@Aashish:nothing 可以处理错误的函数参数。如果您的用户想要破坏您的代码,他们可以。记录您的功能,让您的用户担心正确使用它。