memcpy(3)

Fonction de la bibliothèque C

Copie n octets d'une zone mémoire vers une autre et renvoie la destination. Les deux zones ne doivent pas se chevaucher, sinon le résultat est indéfini.

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

Description

memcpy copie n octets bruts depuis src vers dest. C'est une copie d'octets, pas de chaîne : elle ne s'arrête sur aucun '\0', elle copie exactement le nombre demandé. C'est ce qui la rend utile pour des structures, des tableaux, n'importe quelle zone mémoire, pas seulement du texte.

La contrainte à retenir est dans la signature : le restrict sur les deux pointeurs dit au compilateur que les zones ne se chevauchent pas. La norme C23 est nette, « If copying takes place between objects that overlap, the behavior is undefined ». Si tes zones peuvent se recouvrir, par exemple quand tu décales des données à l'intérieur d'un même tableau, prends memmove(3).

Valeur de retour

memcpy renvoie dest, l'adresse de destination que tu lui as passée. Cette valeur sert rarement, elle permet d'enchaîner des appels.

Exemple

memcpy.c
#include <stdio.h>#include <string.h>
int main(void){    char src[] = "git push";    char dst[16];
    memcpy(dst, src, sizeof(src));   /* sizeof inclut le '\0' */    printf("%s\n", dst);    return 0;}
Terminal
$ gcc -Wall -Wextra -g memcpy.c -o memcpy$ ./memcpygit push

Pièges

  • Copier une chaîne sans le '\0' : memcpy ne l'ajoute pas. Copie strlen(src) + 1 octets, ou utilise sizeof sur un tableau.

  • Oublier que dest doit être assez grand pour n octets : un dépassement ne plante pas toujours, mais c'est un bug que Valgrind attrape.

  • S'en servir sur des zones qui se chevauchent : résultat indéfini, c'est le rôle de memmove.

C

memcpy

Écris gm_memcpy, qui copie exactement n octets un par un et ne s'arrête pas sur un octet nul, contrairement à une copie de chaîne.

Ouvrir l'exercice

À toi d'écrire le code.