Вопрос по воссозданию функции memmove

Нашел интересный способ воссоздания библиотечной функции memmove.

(The memmove() function copies n bytes from memory area src to memory area dest. The memory areas may overlap: copying takes place as though the bytes in src are first copied into a temporary array that does not overlap src or dest, and the bytes are then copied from the temporary array to dest)

Но никак не могу понять - как работает простое с виду условие предотвращения наложения (overlap) if (dest > src). Оно сравнивает длину строки dest и src или же номер адреса памяти dest и src? Если предположить что величину строки - то попробуем симулировать ситуацию с наложением, вместо mdest задав в качестве параметра msrc+2, что должно вызвать ситуацию наложения одной строки на другую при копировании. Вот так: ft_memmove((msrc+2), msrc, 2);

По логике msrc+2 короче msrc и наше условие if (dest > src) выполняться не должно, но оно все равно почему-то выполняется предотвращая наложение. Как это работает?


void    *ft_memmove(void *dest, const void *src, size_t n)
{
    size_t            i;
    char            j;
    unsigned char    *d;
    unsigned char    *s;

    i = 0;
    j = 1;
    d = (unsigned char *)dest;
    s = (unsigned char *)src;
    if (!dest && !src)
        return (NULL);
    if (dest > src)
    {
        j = -1;
        d += n - 1;
        s += n - 1;
    }
    while (i < n)
    {
        *d = *s;
        d += j;
        s += j;
        i++;
    }
    return (dest);
}

#include <stdio.h>
int main()
{    
  char msrc[] = "abcde";
  char mdest[4];  
  ft_memmove(mdest, msrc, 2); 
return 0;
}

Ответы (0 шт):