2015-08-03 4 views
3

La définition de la fonction de bibliothèque c memmove est comme ce qui suit:Pourquoi `memmove` utilise` void * `comme paramètre au lieu de` char * `?

void* memmove(void *s1, const void *s2, size_t n) 
{ 
    char *sc1; 
    const char *sc2; 

    sc1 = s1; 
    sc2 = s2; 
    ... 
} 

Je me demande pourquoi avons-nous besoin d'utiliser comme type de paramètres void* et const void*. Pourquoi ne pas directement char* et const char*?

mise à jour

int test_case[] = {1, 2, 3, 4, 5, 6, 7, 8, 10}; 

memmove(test_case+4, test_case+2, sizeof(int)*4); 

sortie: test_case = {1, 2, 3, 4, 3, 4, 5, 6, 10}

+2

Parce que ce n'est pas une fonction de chaîne mais une fonction de mémoire; l'utilisation de 'void *' le fait fonctionner avec n'importe quel type de pointeur et pas avec ceux de 'char *'. – Jack

Répondre

4

void * est le type de pointeur générique. memmove est supposé manipuler la mémoire quel que soit le type d'objets présents dans la mémoire.

De même pour memcpy. Comparez-le avec strcpy qui utilise les paramètres char * car il est supposé manipuler des chaînes.

6

Si char* et const char* sont utilisés, alors nous devons toujours jeter à char* lors de l'appel memmove sur d'autres types. En utilisant void* et const void*, nous sommes en mesure d'écrire du code plus court, et la distribution n'a pas de surcharge de performance.