64 votes

Pourquoi memset prend-il un int au lieu d'un char?

Pourquoi memset prend un int comme deuxième argument au lieu d'un char , alors que wmemset prend un wchar_t au lieu de quelque chose comme long ou long long ?

68voto

Jerry Coffin Points 237758

memset antérieure (très peu) l'ajout de prototypes de fonction à C. Sans un prototype, vous ne pouvez pas passer un char à une fonction-quand/si vous essayez, il va être promu int quand vous le passer, et ce que la fonction reçoit est un int.

Il est également intéressant de noter que, dans C, un caractère littéral comme 'a' ne pas avoir de type char -- elle est de type int, de sorte que vous passer sera généralement commencer comme un int de toute façon. Essentiellement, le seul moyen pour elle de commencer comme un char et obtenir une promotion si vous passez un char variable.

En théorie, memset pourrait probablement être modifiée de sorte qu'il reçoit un char au lieu d'un int, mais il y a peu de chances d'être un avantage, et pas mal de possibilité de casser quelques vieux code, ou d'autres. Avec une inconnue, mais potentiellement coût assez élevé, et presque aucune chance de l'avantage réel, je dirais que les chances d'être modifié pour recevoir un char automne à droite sur la ligne entre "slim" et "aucun".

Edit (réponse aux commentaires): L' CHAR_BIT bits de poids faible de l' int sont utilisés en tant que valeur à écrire sur la cible.

6voto

Frédéric Hamidi Points 123646

Probablement la même raison que les fonctions en <ctypes.h> prendre ints et pas chars.

Sur la plupart des plates-formes, un char est trop petit pour être placé sur la pile par lui-même, donc en général on pousse le type le plus proche de la machine de la taille de mot, c'est à dire int.

Comme le lien de @Gui13s'commentaire souligne, en faisant cela augmente également les performances.

-2voto

Alexandros Points 1235

En fait, il peut prendre un argument char (qui est implicitement converti par le compilateur en entier). Jetez un œil à ceci:

http://www.cplusplus.com/reference/clibrary/cstring/memset/

(Il s'agit en fait de C ++ mais cela fonctionne également avec C)

Il en va de même pour wmemset.

-4voto

Gui13 Points 3568

Voir la réponse de Fred, c'est pour des raisons de performances.

De mon côté, j'ai essayé ce code:

 #include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[])
{
    char c = 0x00;

    printf("Before: c = 0x%02x\n", c);
    memset( &c, 0xABCDEF54, 1);
    printf("After:  c = 0x%02x\n", c);

    return 0;
}
 

Et cela me donne ceci sur un Mac 64 bits:

 Before: c = 0x00
After:  c = 0x54
 

Donc, comme vous le voyez, seul le dernier octet est écrit. Je suppose que cela dépend de l'architecture (endianness).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X