-
Notifications
You must be signed in to change notification settings - Fork 0
memmove_implementation
memcpy - copia n bytes do src para o dest. Caso ococorra overlap, o resultado é indefinido.
memmove - copia n bytes do src para o dest e faz o tratamento do overlap, ou seja, caso ocorra o overlap não há perda de dados. Exemplo:
char test1[100] = "alisson";
char test2[100] = "alisson";
memcpy(test1+2, test1, 3);
printf("%s\n", test1);
memmove(test2+2, test2, 3);
printf("%s\n", test2);alalaon
alalion
Porém, em algumas situações, quando eu chamo o memcpy e memmove com os mesmos inputs e com overlap, os resultados são iguais. Então, em algumas situações o memcpy trata o overlap corretamente. Exemplo:
char test1[100] = "alisson";
char test2[100] = "alisson";
memcpy(test1+2, test1, 4);
printf("%s\n", test1);
memmove(test2+2, test2, 4);
printf("%s\n", test2);alalisn
alalisn
Como o padrão diz que o resuldado de overlap no memcpy é indefinido, não podemos esperar que o memcpy sempre faça esse tratamento, porque isso seria inseguro, as vezes ele faz e as vezes não. Sobre o memmove, como o padrão diz que ele faz o tratamento caso ocorra overlap, então temos a garantia que o memmove com overlap não terá perda de dados.
void *ft_memmove(void *dest, const void *src, size_t n)
{
if (dest < src)
return(ft_memcpy(dest, src, n));
while (n--)
((unsigned char *)dest)[n] = ((unsigned char *)src)[n];
return (dest);
}Quando o dest é menor, o fim do dest é o começo do src. Começando a cópia pelo começo do src (dest[0] = src[0], dest[1] = src[1], ...) ao chegar no fim do dest, o começo src será sobrescrito, mas ele já foi copiado, então não há perda de dados.
<dest.....>
<src.....>
Para testar:
char test1[100];
ft_strlcpy(test1 + 3, "alisson", sizeof test1);
ft_memmove(test1, test1 + 3, 8); // test1 é menor que test1 + 3
printf("%s\n", test1);alisson
Quando o dest é maior, o fim do src é o começo do dest. Começando a cópia pelo fim do src (dest[10] = src[10], dest[9] = src[9], ...), ao chegar no começo do dest, o fim do src será sobrescrito, mas ele já foi copiado, então não há perda de dados.
<src.....>
<dest.....>
Para testar:
char test1[100] = "alisson";
ft_memmove(test1 + 3, test1, 8); // test + 3 é maior que test1
printf("%s\n", test1);alialisson