
不需要考虑dst和src有重叠的情况
1 |
static void *(void *dst, const void *src, size_t n) |
memmove
需要考虑mem有重叠的情况

重叠有两种情况
- dst部分地址被src踩到
从小到大依字节cp,和memcpy一致 - src部分地址被dst踩到
从大到小依字节cp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20static void *memmove(void *dst, const void *src, size_t n)
{
if (dst==NULL || src==NULL)
return NULL;
char *p1 = (char *)dst;
char *p2 = (char *)src;
if ((p1>p2) && ((p1-p2)<n)) {
// 情况2
while (n--)
*(p1+n) = *(p2+n); // 从大到小依字节cp
} else {
// 情况1
while (n--)
*(p1++) = *(p2++); // 从小到大依字节cp
}
return dst;
}




近期评论