虽然说段拷贝是5年前的事情了,但是还是被人问到吐血.
记得,上中专的时候,老师说过段拷贝.那时是使用si,di的.不过老师在上课的时候介绍的比较简单,就是通过看题目上的条件,如果数
据区域有交集,需要使用何种方式拷贝?
反着传!
怎么反呢?
如果,SRC>=DEST并且有交集的话,我们需要从数据区的低地址向高地址传递.
如果,DEST>SRC并且有交集的话,我们需要从数据区的高地址向低地址传递.
这样可以保证,数据的完整性.
void *memmove(void *dest, const void *src, size_t count)
{
char *tmp;
const char *s;
if (dest <= src) {
tmp = dest;
s = src;
while (count--)
*tmp++ = *s++;
} else {
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--)
*--tmp = *--s;
}
return dest;
}
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}