MEMCPY |
Copie mémoire |
---|---|
Langage C++ | cstring (string.h) |
Syntaxe
void *memcpy(const void *tampondestination, const void *tamponsource, size_t n) |
Paramètres
Nom | Description |
---|---|
tampondestination | Ce paramètre permet d'indiquer le tampon recevant les données |
tamponsource | Ce paramètre permet d'indiquer le tampon contenant les données à copier |
n | Ce paramètre permet d'indiquer la taille du tampon en octets |
Description
Cette fonction permet de copier un tampon source dans un tampon de destination de «n» octets.
Remarques
- La fonction memcpy() copie le nombre de caractères du tableau pointé par le paramètre tamponsource dans le tableau pointé par tampondestination. Si les tableaux se chevauchent, le comportement de memcpy() est imprévisible.
- La fonction memcpy() renvoie un pointeur sur le paramètre tampondestination.
- Définition et utilité : La fonction memcpy est définie dans la bibliothèque <cstring> (ou <string.h> en C) et sert à copier un bloc de mémoire d'un emplacement à un autre. Elle est couramment utilisée pour dupliqué des tableaux ou des structures en mémoire. Contrairement à memmove, gérant les chevauchements de mémoire, memcpy suppose que les zones de mémoire source et destination ne se chevauchent pas, ce qui la rend plus rapide dans ces cas.
- Optimisation des performances : memcpy est généralement très performante, car elle est souvent optimisée pour des architectures spécifiques par les implémentations des bibliothèques standard. Les optimisations peuvent inclure l'utilisation de techniques comme le copier par blocs ou l'utilisation de registres spéciaux pour accélérer les opérations de copie. Pour de petites tailles de blocs de mémoire, elle est habituellement plus rapide que des boucles manuelles de copie.
- Non-concernée par le type des données : memcpy copie les octets de la mémoire brute, indépendamment du type des données qu'ils représentent. Cela signifie qu'elle peut être utilisée pour copier n'importe quel type de données : chaînes de caractères, structures, tableaux de nombres, ou même des zones de mémoire non structurées. Cette flexibilité est l'une des raisons pour lesquelles memcpy est largement utilisée dans des applications systèmes ou pour la gestion de tampons.
- Sécurité et risques liés au dépassement de tampon : L'un des principaux risques associés à l'utilisation de memcpy est le dépassement de tampon, pouvant se produire si le paramètre num est trop grand par rapport à la taille de la zone mémoire cible (dest). Ce risque peut entraîner des comportements indéfinis, comme l'écrasement de données importantes dans la mémoire. Il est donc essentiel de s'assurer que la taille de la mémoire source et de la mémoire cible est adéquate avant d'utiliser memcpy.
- Pas de gestion des chevauchements : Contrairement à memmove, memcpy ne gère pas les chevauchements entre les zones source et destination. Si les zones mémoire se chevauchent, l'utilisation de memcpy peut entraîner des comportements indéfinis, car elle ne garantit pas l'ordre de copie des octets. Si vous avez besoin de copier des zones mémoire qui se chevauchent, il est préférable d'utiliser memmove, prenant en charge ce cas spécifique.
- Limitation par la taille de num : Le paramètre num spécifie le nombre d'octets à copier, mais il n'y a pas de mécanisme interne de vérification de la taille des blocs de mémoire source et destination. L'utilisateur doit être vigilant et s'assurer que la taille de la mémoire source et destination est suffisante pour accueillir le nombre d'octets spécifié. Si num dépasse la taille de l'une des zones, cela peut entraîner une copie incorrecte et des erreurs de mémoire.
- Retour du pointeur dest : memcpy retourne un pointeur vers la destination (dest). Cette caractéristique est pratique, car elle permet d'enchaîner plusieurs appels à memcpy ou de simplement récupérer la zone de destination après la copie. Par exemple, vous pouvez effectuer une série de copies dans des tampons différents tout en utilisant le même pointeur de retour pour référencer la zone finale de destination.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :

on obtiendra le résultat suivant :
B[0] = 0B[1] = 1
B[2] = 2
B[3] = 3
B[4] = 4
B[5] = 5
B[6] = 6
B[7] = 7
B[8] = 8
B[9] = 9
B[10] = 10
B[11] = 11
Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - memmove
Langage de programmation - C++ - Référence de procédures et fonctions - memset
Langage de programmation - C - Référence de procédures et fonctions - memcpy
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 733.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 175.
Dernière mise à jour : Lundi, le 3 août 2015