Skip to content

Instantly share code, notes, and snippets.

@Kerollmops
Last active April 24, 2016 15:20
Show Gist options
  • Save Kerollmops/81da0c9cdb987bc7dce004c053b4ce66 to your computer and use it in GitHub Desktop.
Save Kerollmops/81da0c9cdb987bc7dce004c053b4ce66 to your computer and use it in GitHub Desktop.
French memmove details

memmove details

memmove

void *memmove(void *dst, const void *src, size_t len);

Copier la source dans la destination d'une maniere non destructive.

details

Prenons cette chaine de caractère lorem = "Lorem ipsum dolor sit amet". Et si nous utilisions memcpy dessus pour écraser les 6 premiers caractères:

// curseur d'ecriture: debut de la chaine
// curseur de lecture: debut de la chaine + 6 caractères
memcpy(lorem, &lorem[6], strlen(lorem) - 6);

// `assert` arrete le programme si le resultat est faux
assert(strcmp(lorem, "ipsum dolor sit amet") == 0); // ici il n'y a pas de difference

Aucun problème ne survient car nous copions les données depuis un point qui se trouve à l'avant du point d'écriture. Le curseur d'écriture ne peux pas entrer en conflit avec le curseur de lecture.

Le problème de copie destructive peu subvenir lorsque le curseur de lecture se trouve derrière le curseur d'écriture, cela dépend de la distance des deux curseurs et de la quantité de donnée à écrire. Un exemple, on veut que lorem soit égal à "LorLoremsum dolor sit amet":

// curseur d'ecriture: debut de la chaine + 3 caractères
// curseur de lecture: debut de la chaine
memcpy(&lorem[3], lorem, 5);

assert(strcmp(lorem, "LorLoremsum dolor sit amet") == 0); // une erreur survient
printf("%s", lorem); // affiche: "LorLorLosum dolor sit amet"

Le curseur d'ecriture a écrasé les données que nous allions lire avec le curseur de lecture... Mais par exemple, si nous avions voulu lorem égal à "Lorem Lorem dolor sit amet", soit recopier les 6 premiers caractères à partir du 6ème, nous n'aurions pas eu de problème d'écrasement.

memmove utilise un malloc dans certaines conditions pour sauvegarder les données à copier et ne pas les détruires. cette duplication en interne n'est pas à utiliser dans toutes les cas, rappelons que les pointeurs sont seulement des chiffres, ils indiquent une position dans la RAM et l'arithmetique des pointeurs peut être très utile dans ce genre de fonction:

// un exemple d'arithmetique sur pointeur
if (&dst[data_lenght] > src)
  // ...
else
  // ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment