memmove和memcopy
> 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。
两者的功能基本相同,唯一不同的是,当 dest 和 src 有重叠的时候选用不同的函数可能会造成不同的结果。
1. 当 src 和 dest 所指内存区有重叠时,memmove 相对 memcpy 能提供保证能将 src 所指内存区的前 n 个字节正确的拷贝到 dest 所指内存中;
2. 当 src 地址比 dest 地址低时,两者结果一样。换句话说,memmove 与 memcpy 的区别仅仅体现在 dest 的头部和 src 的尾部有重叠的情况下;
- memmove
```
// 伪代码
void *memmove(void *dest, const void *src, size_t n) {
char temp[n];
int i;
char *d = dest;
const char *s = src;
for (i = 0; i < n; i++) {
temp[i] = s[i];
}
for (i = 0; i < n; i++) {
d[i] = temp[i];
}
return dest;
}
```
- memcopy
```
// 伪代码
void *memcopy(void *dest, const void *src, size_t n) {
char *d = dest;
const char *c = src;
int *di;
const int *si;
int r = n % 4;
while (r--) {
*d++ = *s++;
}
di = (int *)d;
si = (const int *)s;
while (n--) {
*di++ = *si++;
}
return dest;
}
```