http://blog.csdn.net/lxgwm2008/article/details/11952285
一直以来知道memcpy函数有问题,没有处理内存重叠的情况;而memmove函数对这种情况进行了处理。今天碰巧有同事问到,特地翻了一下源码,了解一下实现方法,大体如下:
-
void *memcpy(void *dst, const void *src, size_t len)
-
{
-
if(NULL == dst || NULL == src){
-
return NULL;
-
}
-
-
void *ret = dst;
-
-
if(dst <= src || (char *)dst >= (char *)src + len){
-
-
while(len--){
-
*(char *)dst = *(char *)src;
-
dst = (char *)dst + 1;
-
src = (char *)src + 1;
-
}
-
}else{
-
-
src = (char *)src + len - 1;
-
dst = (char *)dst + len - 1;
-
while(len--){
-
*(char *)dst = *(char *)src;
-
dst = (char *)dst - 1;
-
src = (char *)src - 1;
-
}
-
}
-
return ret;
-
}
从注释可以看出,当有内存重叠是,拷贝是倒序进行的。
特此记录,以备忘。
阅读(528) | 评论(0) | 转发(0) |