mem处理 memmove

不需要考虑dst和src有重叠的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void *(void *dst, const void *src, size_t n)
{
if (dst==NULL || src==NULL)
return NULL;


char *p1 = (char *)dst;
char *p2 = (char *)src;

while (n--)
*(p1++) = *(p2++);

// 返回,可以级联使用
return dst;
}

memmove

需要考虑mem有重叠的情况

memmove

重叠有两种情况

  1. dst部分地址被src踩到
    从小到大依字节cp,和memcpy一致
  2. src部分地址被dst踩到
    从大到小依字节cp
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    static 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;
    }