memmove(3)

Fonction de la bibliothèque C

Copie n octets d'une zone vers une autre en donnant le bon résultat même quand les deux se chevauchent. Renvoie la destination, comme memcpy.

Synopsis
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);

Description

memmove fait le même travail que memcpy(3), copier n octets de src vers dest, avec une garantie en plus : le résultat est correct même quand les deux zones se chevauchent. La norme C23 le décrit par une image, la copie se passe « as if the n characters from the object pointed to by s2 are first copied into a temporary array » puis recopiés vers la destination. Le tableau intermédiaire n'existe pas vraiment, mais le résultat est le même : aucun octet source n'est écrasé avant d'avoir été lu.

C'est toute la différence avec memcpy. Si tu décales des données vers l'avant dans un même tableau avec memcpy, tu écrases des octets source avant de les avoir copiés, et la fin est corrompue. Une implémentation de memmove regarde le sens du chevauchement et copie d'arrière en avant quand il le faut.

Valeur de retour

memmove renvoie dest, comme memcpy.

Exemple

Un décalage de deux positions à l'intérieur d'un même tableau, le cas classique où memcpy échouerait :

memmove.c
#include <stdio.h>#include <string.h>
int main(void){    char buf[] = "0123456789";
    memmove(buf + 2, buf, 5);    printf("%s\n", buf);    return 0;}
Terminal
$ gcc -Wall -Wextra -g memmove.c -o memmove$ ./memmove0101234789

Les cinq premiers octets (01234) ont bien été recopiés deux cases plus loin, sans se marcher dessus.

Pièges

  • Prendre memmove par défaut « au cas où » : quand tu sais que les zones ne se chevauchent pas, memcpy exprime cette hypothèse et peut être plus rapide.

  • Croire que memmove ajoute un '\0' : non, c'est une copie d'octets, comme memcpy.

  • Se tromper de taille n : elle compte des octets, pas des éléments. Pour un tableau d'int, c'est n * sizeof(int).

C

memmove

Écris gm_memmove, qui copie de la fin vers le début quand dst est après src, pour que deux zones qui se chevauchent donnent le bon résultat.

Ouvrir l'exercice

À toi d'écrire le code.