memcpy,memmove重叠拷贝
2021-08-30
217
0
内存的复制一般使用memmove和memcopy这两种函数,当内存不重叠时,这两个函数可以说是没有区别的。但当出现内存重叠时,就会出现不同的结果。
内存的复制函数一般定义如下:
void *fun(void *dest, const void *src, size_t count)
函数将从原一地址复制到目标内存地址,复制的内存数据大小为count。
但是在内存复制时,一般又是一个字节一个字节复制的,所以当内存重叠时,有可能出现复制前面一般的字节的时候,会修改即将要复制的的数据,造成数据复制后和复制前的数据不一致。
如上面所示,如果使用strcpy和memcpy函数对于第一种情况会拷贝出错。而memmove可以解决内存重叠问题。
strcpy,memcpy是从头部开始复制数据。
memmove通过判断指针来选择使用增量复制还是减量复制。
解决的核心就是判断内存首指针的大小
- 当目的地址小于源地址时,所以会出现在目的地址的尾部(或源地址的头部)出现数据重叠,这以这时从头部开始复制数据。
- 当目的地址大于源地址时,会出现在目的地址的头部(或源地址的尾部)出现数据重叠,这时就不可以从头开始复制数据了,因为这样复制的前一段字节会到目的地址,而这个目的地址又是源地址一段即将要复制的数据,出现数据覆盖拷贝,但如果从尾部开倒车进行复制,就没有问题。
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;
}