MEMSET |
Fixe la mémoire |
---|---|
Langage C++ | cstring (string.h) |
Syntaxe
void *memset(const void *tampon, int caractere, size_t n) |
Paramètres
Nom | Description |
---|---|
tampon | Ce paramètre permet d'indiquer le tampon à traiter |
caractere | Ce paramètre permet d'indiquer le caractère à copier |
n | Ce paramètre permet d'indiquer la taille du tampon en octets |
Description
Cette fonction permet de rechercher un caractère dans le tampon de «n» octets.
Remarques
- La fonction memset() copie l'octet de poids faible de caractere dans les premiers caractères de compteur du tableau pointé par tampon. Elle renvoie tampon.
- L'utilisation la plus courante de memset() consiste à initialiser une région de mémoire à une valeur connue.
- Définition et utilité : La fonction memset est définie dans la bibliothèque <cstring> (ou <string.h> en C) et permet d'initialiser une zone de mémoire avec une valeur donnée. Elle est couramment utilisée pour remplir des tableaux, des tampons ou des structures avec une valeur spécifique (généralement zéro ou une valeur spécifique comme 0xFF pour initialiser ou nettoyer des données).
- Initialisation de la mémoire : memset est souvent utilisée pour initialiser un bloc de mémoire à une valeur spécifique. Par exemple, elle est couramment utilisée pour remplir un tableau ou une structure avec des zéros (0) avant de commencer à l'utiliser. Cela est particulièrement utile pour éviter l'utilisation de données non initialisées, ce qui pourrait conduire à des comportements indéfinis dans le programme.
- Manipulation des octets : Il est important de noter que la fonction memset remplit la zone mémoire par byte (octet). Cela signifie que la valeur fournie (value) est traitée comme un byte (c'est-à-dire, les 8 bits de la valeur entière sont utilisés pour remplir chaque octet de la mémoire). Par exemple, si vous utilisez memset(ptr, 255, num), chaque octet de la zone mémoire sera initialisé à 0xFF (étant la valeur binaire 11111111).
- Limitation à la manipulation d'octets : Contrairement à des fonctions comme memcpy, copiant des blocs de mémoire de manière binaire (en respectant les types de données), memset remplit la mémoire byte par byte. Cela signifie que la fonction ne sait rien des types ou de la signification des données dans la zone mémoire. Par exemple, si vous tentez de remplir une zone mémoire de structures avec un entier spécifique, cela ne garantit pas que la structure soit correctement initialisée si l'entier n'est pas un octet valide pour les types dans la structure.
- Optimisation des performances : memset est souvent optimisée pour les architectures matérielles spécifiques, et dans la plupart des implémentations de la bibliothèque standard, elle est extrêmement rapide. Cela est dû à l'utilisation de techniques d'optimisation telles que l'alignement des blocs mémoire ou des instructions processeur optimisées pour remplir plusieurs octets à la fois. En général, elle est plus rapide que d'autres méthodes d'initialisation manuelle utilisant des boucles dans le code.
- Cas d'utilisation courants : La fonction memset est couramment utilisée pour : Initialiser des tampons à une valeur particulière avant leur utilisation. Réinitialiser un tableau à des valeurs spécifiques après un traitement. Nettoyer la mémoire, par exemple, pour éviter de laisser des informations sensibles dans un tampon après son utilisation. Préparer des structures pour des calculs en réinitialisant leurs champs à zéro.
- Précautions d'utilisation : Bien que memset soit un outil pratique pour manipuler la mémoire, il est important de l'utiliser avec prudence. Si vous utilisez une valeur spécifique n'étant pas un octet valide pour le type de données dans la zone mémoire, cela pourrait mener à des résultats inattendus. Par exemple, memset(ptr, -1, num) dans un tableau d'entiers pourrait entraîner des résultats incorrects si le tableau est utilisé pour stocker des entiers signés, car -1 en binaire ne correspond pas nécessairement à une valeur significative pour un entier.
Exemples
Voici un exemple permettant d'initialiser tous les valeurs d'une structure de données rapidement :

- #include <iostream>
- #include <cstring>
-
- int main()
- {
- struct {
- double X1;
- double Y1;
- double X2;
- double Y2;
- char titre[255];
- } coord;
- memset(&coord,0,sizeof(coord));
- std::cout << "X1 = " << coord.X1 << std::endl;;
- std::cout << "Y1 = " << coord.Y1 << std::endl;
- std::cout << "X2 = " << coord.X2 << std::endl;
- std::cout << "Y2 = " << coord.Y2 << std::endl;
- std::cout << "titre = " << coord.titre << std::endl;
- return 0;
- }
on obtiendra le résultat suivant :
X1 = 0.000000Y1 = 0.000000
X2 = 0.000000
Y2 = 0.000000
titre =
Cet exemple permet de répéter le caractère astérisque 50 fois :

on obtiendra le résultat suivant :
DuplicateString = **************************************************Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - memcpy
Langage de programmation - C - Référence de procédures et fonctions - memset
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 177.
Dernière mise à jour : Lundi, le 3 août 2015