Quelle est l'utilité de la valeur de retour de memset ()?

88

memset()est déclarée renvoyer void*qui est toujours la même valeur que l'adresse passée dans la fonction.

Quelle est l'utilité de la valeur de retour? Pourquoi ne revient-il pas void?

dents acérées
la source
2
A quoi sert la valeur de retour de strcat()? Parfois, les fonctions standard sont ce qu'elles sont spécifiées et non ce qu'elles devraient être.
DevSolar
4
@MatthieuM .: De plus, il y a généralement un coût non nul associé au retour des choses. Même si la valeur de retour tient dans un registre, vous devez généralement charger cette valeur dans le registre. Cela a un coût, même minime.
NPE
15
@sharptooth: Une fonction "tuer tous les humains" renverrait le nombre d'humains tués, bien sûr.
indiv
2
@MatthieuM .: Vous ne vous soucieriez pas de telles anecdotes, mais je pourrais certainement. Et si j'écris un compilateur pour un système de ressources limitées? Hmmm?
Thomas Eding

Réponses:

34

La signature est conforme à toutes les autres fonctions similaires: memcpy(), strcpy()etc. J'ai toujours pensé cela a été fait pour permettre de enchaîner les appels à ces fonctions, et d' utiliser autrement ces appels dans les expressions.

Cela dit, je n'ai jamais rencontré de situation réelle dans laquelle je me sentirais obligé d'utiliser la valeur de retour de cette manière.

NPE
la source
121

Il peut être utilisé pour le chaînage d'appels comme:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Juraj Blaho
la source
9
Oui, c'est certainement le cas d'utilisation du «chaînage».
Cartesius00
6
J'ai voté pour la réponse, car c'est un cas intéressant. Mais dans la vraie vie, je pense qu'il est préférable de séparer les appels memset et strcpy.
Tsvetomir Dimitrov
24
Les programmeurs C aiment le code illisible, donc permettre un chaînage infini est un must lors de la conception d'une fonction standard.
Chad Schouggins
@ChadSchouggins Lisez du code haskell et vous savez que les c-programmeurs sont en fait assez verbatim;) (pense à l'expression régulière "operator" = ~) ...
BitTickler
Bien sûr, dans cet exemple, cela aurait même plus de sens, l'inverse, strcpyde renvoyer le pointeur au-delà du dernier copié. memset(my_strcpy(a, "bla"), 0, a + 200);(comme std::copy_net std::fill_nfaire en C ++).
alfC
12

Afin d'utiliser la fonction comme argument pour une autre fonction telle que sprintf

Noé
la source
0

Je suis tombé sur cette question en cherchant sur Google pour voir ce que memset retournait.

J'ai un code dans lequel je teste une valeur, puis si c'est vrai, testez si une valeur est égale à des zéros.

Comme il n'y a pas de moyen complètement portable en C de tester les zéros, je dois exécuter memset au milieu.

Donc mon code est:

if ( a==true && (memcmp(memset(zeros, 0, sizeof(zeros)), b, sizeof(zeros)) == 0) )

Cela témoigne de l'objectif de chaînage indiqué dans les questions précédentes, mais c'est un exemple d'utilisation de cette technique.

Je laisserai aux autres le soin de juger si c'est un bon codage ou non.

Gérard Nicol
la source