C memmove()的代码
下面的代码片段显示了C memmove()的代码,c,memmove,C,Memmove,下面的代码片段显示了memmove()的实现 为什么my_memmove()工作不正常(它更改my_str以输出空字符串)?对于无符号整数,条件i>=0始终为真。最好使用“-1”反转偏差编写惯用循环: for (i = 0; i != size; ++i) d[size - i - 1] = s[size - i - 1]; 另外,附加条件s[i]&&看起来显然是错误的。对于无符号整数,条件i>=0总是正确的。最好使用“-1”反转偏差编写惯用循环: for (i = 0; i != s
memmove()
的实现
为什么my_memmove()工作不正常(它更改my_str以输出空字符串)?对于无符号整数,条件
i>=0
始终为真。最好使用“-1”反转偏差编写惯用循环:
for (i = 0; i != size; ++i)
d[size - i - 1] = s[size - i - 1];
另外,附加条件
s[i]&&
看起来显然是错误的。对于无符号整数,条件i>=0
总是正确的。最好使用“-1”反转偏差编写惯用循环:
for (i = 0; i != size; ++i)
d[size - i - 1] = s[size - i - 1];
另外,附加条件
s[i]&&
看起来完全错误。您假设src和dest指向
指向同一内存块中的点
...
char* d = (char*)dest;
char* s = (char*)src;
if( s > d )
...
这意味着,如果任何人调用您的函数时src和dest指向内存中的两个不同位置,您将得到未定义的行为
这非常糟糕,只需使用内置的memmove()。您假设src和dest是指向的 指向同一内存块中的点
...
char* d = (char*)dest;
char* s = (char*)src;
if( s > d )
...
这意味着,如果任何人调用您的函数时src和dest指向内存中的两个不同位置,您将得到未定义的行为
这非常糟糕,只需使用内置的memmove()。这一定是一个家庭作业,因为这是到目前为止这个问题的第二个副本。同时,你到底为什么要在这里比较>或<的指针?还有,为什么要用
s[i]
进行空检查?您已经有了大小。@b说明它会影响循环的方向。memmove必须防止内存重叠。使用s[i]进行null检查可处理过大的内存。如果大小是50怎么办?@Aashish:没有任何东西可以处理错误的函数参数。如果你的用户想要破坏你的代码,他们可以。记录你的函数,让你的用户担心是否正确使用它。这一定是一个家庭作业,因为这是这个问题到目前为止的第二份副本。同时,你到底为什么要在这里比较>或<的指针?还有,为什么要用s[i]
进行空检查?您已经有了大小。@b说明它会影响循环的方向。memmove必须防止内存重叠。使用s[i]进行null检查可处理过大的内存。如果大小是50怎么办?@Aashish:没有任何东西可以处理错误的函数参数。如果你的用户想要破坏你的代码,他们可以。记录你的函数,让你的用户担心如何正确使用它。它也可以写成,而(size--)d[size]=s[size]代码>当(大小--)d[size]=s[size]时,它也可以写为代码>