二者都是内存拷贝
memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝。那么既然
memcpy和memmove二者都是内存拷贝
,那二者究竟有什么区别呢?
区别
memcpy
实现代码,注意以下几点:
1.确定函数原型;
2.判断参数合法性;
3.逻辑实现(考虑各种情况,统称逻辑实现);
4.错误处理。
1 void *mymemcpy(void *dest, const void *src, size_t count) 2 { 3 assert(dest != NULL || src != NULL); 4 5 char *tmp = (char *)dest; 6 char *p = (char *)src; 7 8 while (count--) 9 { 10 *tmp++ = *p++; 11 } 12 return dest; 13 }
这样下去,上面的代码会运行的很好,如果出现下面的情况呢?
memmove
1 void *mymemmove(void *dest, const void *src, size_t count) 2 { 3 assert(dest != NULL || src != NULL) 4 5 if (dst < src) 6 { 7 char *p = (char *)dest; 8 char *q = (char *)src; 9 while (count--) 10 { 11 *p++ = *q++; 12 } 13 } 14 else 15 { 16 char *p = (char *)dest + count; 17 char *q = (char *)src + count; 18 while (count--) 19 { 20 *--p = *--q; //注意先-- 21 } 22 } 23 24 return dest; 25 }
实现源码中的确能看出一些猫腻,当出现了src和dest的内存有重合的时机时,memmove的处理规则是从后往前进行copy。当然了,重合的问题,需要考虑的以下两种场合。
如图所示,当出现(1)对应的情况时,就需要先从src的头部开始复制;也就是memmove源码中的if分支,这部分源码和memcpy的实现是一致的;当出现(2)对应的情况时,就需要先从src的尾部开始复制,防止出现了覆盖现象。这就是memmove比memcpy多的一个考虑点,所以说,在实际使用时,使用memmove是比memcpy更安全的。
转载于:https://www.cnblogs.com/raichen/p/5802921.html