Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Fonction memmove

La fonction memcpy La fonction memset


Entête à inclure

#include <string.h>  // <cstring> en C++

Fonction memmove

void * memmove( void * destination, const void * source, size_t size );

Cette fonction permet de copier un bloc de mémoire spécifié par le paramètre source dans un nouvel emplacement désigné par le paramètre destination. On peut donc dire que cette fonction est proche de la fonction memcpy. Néanmoins, la différence réside dans le fait que la fonction memmove accepte que les deux zones de mémoire puissent se chevaucher.

En cas de chevauchement, la copie se passe comme si les octets de la zone source étaient d'abord copiés dans une zone temporaire, qui ne chevauche aucune des deux zones pointées par source et destination, et les octets sont ensuite copiés de la zone temporaire vers la zone de destination.

Paramètres

Valeur de retour

La fonction renvoie l'adresse du bloc de mémoire de destination.

Exemple de code

L'exemple de code suivant déplace les valeurs d'un tableau d'entier d'une entrée vers la droite afin d'y insérer une nouvelle valeur en tête.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENT_COUNT 10

int main() {

    // On crée une zone de mémoire de 10 entiers et contenant
    // que neuf valeurs. La dixième est non utilisée (0).
    int data[] = { 20, 30, 40, 50, 60, 70, 80, 90, 100, 0 };

    // On affiche le contenu de la collection
    for( int i=0; i<ELEMENT_COUNT; i++ ) {
        printf( "%d ", data[i] );
    }
    puts( "" );  // Un retour à la ligne

    // On décale les éléménts dans la collection ...
    void * source = (void *) data;
    void * destination = (void *) ( data + 1 );
    size_t size = ELEMENT_COUNT * sizeof( int );
    memmove( destination, source, size );

    // ... pour y insérer une nouvelle valeur en tête
    data[0] = 10;

    // On affiche le contenu de la collection
    for( int i=0; i<ELEMENT_COUNT; i++ ) {
        printf( "%d ", data[i] );
    }
    puts( "" );  // Un retour à la ligne

    return EXIT_SUCCESS;
}
Exemple d'utilisation de la fonction memmove.

Et voici le résultat produit par cet exemple de code.

$> gcc -o sample sample.c
$> ./sample
20 30 40 50 60 70 80 90 100 0
10 20 30 40 50 60 70 80 90 100 
$>

Sujets connexes

malloc
memcmp
memcpy
memset


La fonction memcmp La fonction memmove