} else { //如果有重叠(反向拷贝) tmp_source += count - 1; tmp_dest += count - 1; while(count--) *--tmp_dest = *--tmp; } return dest; } 一开始看到这段代码的时候,觉得好神奇啊。后来发现,其实有个很大的漏洞(先不说那些小问题),那就是内存重叠有两种情况。其实我觉得该作者也想到了,而且给出了解决办法。,估计是粗心大意吧。 :srcdest; destsrc。。但是网上那位作者没有写清楚,下面我就重写一下上面的else部分:
[cpp] else { //重叠1:(反向拷贝) if(tmp_source<=tmp_dest&&tmp_source+count>=tmp_dest) { tmp_source += count - 1; tmp_dest += count - 1; while(count--) *tmp_dest-- = *tmp_source--; } //重叠2:(正向拷贝) else { while (count--) { *tmp_dest++=*tmp_source++; } } }
else { //重叠1:(反向拷贝) if(tmp_source<=tmp_dest&&tmp_source+count>=tmp_dest) { tmp_source += count - 1; tmp_dest += count - 1; while(count--) *tmp_dest-- = *tmp_source--; } //重叠2:(正向拷贝) else { while (count--) { *tmp_dest++=*tmp_source++; } } } 但写完之后发现傻逼了。。后面的那个else不可以和前面的那个if写在一起么?所以优化后的完整代码:
[cpp] void *memmove(void *dest, const void *source, size_t count) { assert((NULL != dest) && (NULL != source)); char *tmp_source, *tmp_dest; tmp_source = (char *)source; tmp_dest = (char *)dest; if(tmp_source<=tmp_dest&&tmp_source+count>=tmp_dest) { tmp_source += count - 1; tmp_dest += count - 1; while(count--) *tmp_dest-- = *tmp_source--; } else { while (count--) { *tmp_dest++=*tmp_source++; } } return tmp_dest; }
void *memmove(void *dest, const void *source, size_t count) { assert((NULL != dest) && (NULL != source)); char *tmp_source, *tmp_dest; tmp_source = (char *)source; tmp_dest = (char *)dest;
if(tmp_source<=tmp_dest&&tmp_source+count>=tmp_dest) { tmp_source += count - 1; tmp_dest += count - 1; while(count--) *tmp_dest-- = *tmp_source--; } else { while (count--) { *tmp_dest++=*tmp_source++; } } return tmp_dest; }
|