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.
#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
#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;}$ gcc -Wall -Wextra -g memcpy.c -o memcpy$ ./memcpygit pushPièges
Copier une chaîne sans le
'\0':memcpyne l'ajoute pas. Copiestrlen(src) + 1octets, ou utilisesizeofsur un tableau.Oublier que
destdoit être assez grand pournoctets : 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.
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.