Qual é a utilidade do valor de retorno memset ()?

88

memset()é declarado para retornar void*que é sempre o mesmo valor que o endereço passado para a função.

Qual é a utilidade do valor de retorno? Por que não volta void?

dente afiado
fonte
2
Qual é a utilidade do valor de retorno de strcat()? Às vezes, as funções padrão são o que devem ser, não o que deveriam ser.
DevSolar
4
@MatthieuM .: Além disso, geralmente há um custo diferente de zero associado à devolução de coisas. Mesmo se o valor de retorno couber em um registro, geralmente você precisa carregar esse valor no registro. Isso tem um custo, embora pequeno.
NPE
15
@sharptooth: Uma função "matar todos os humanos" retornaria o número de humanos mortos, é claro.
indiv
2
@MatthieuM .: Você não se preocuparia com essas trivialidades, mas eu certamente me preocuparia . E se eu estiver escrevendo um compilador para um sistema de recursos limitados? Hmmm?
Thomas Eding

Respostas:

34

A assinatura está em linha com todas as outras funções semelhantes: memcpy(), strcpy()etc. Eu sempre achei que isso foi feito para permitir um para chamadas cadeia para tais funções, e de outra forma utilizar tais chamadas em expressões.

Dito isso, nunca me deparei com uma situação do mundo real em que me sentisse compelido a usar o valor de retorno dessa maneira.

NPE
fonte
121

Pode ser usado para encadeamento de chamadas como:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Juraj Blaho
fonte
9
Sim, é definitivamente o caso de uso de 'encadeamento'.
Cartesius00
6
Eu votei a resposta, porque é um caso interessante. Mas, na vida real, acho melhor manter as chamadas memset e strcpy separadas.
Tsvetomir Dimitrov
24
Os programadores de C adoram código ilegível, portanto, permitir o encadeamento infinito é uma necessidade ao projetar uma função padrão.
Chad Schouggins
@ChadSchouggins Leia algum código haskell e você saberá que os programadores c são na verdade bastante literalmente;) (pensa em regex "operador" = ~) ...
BitTickler
Claro que neste exemplo teria feito mais sentido até, ao contrário, para strcpyretornar o ponteiro após o último copiado. memset(my_strcpy(a, "bla"), 0, a + 200);(como std::copy_ne std::fill_nfazer em C ++).
alfC de
12

Para usar a função como um argumento para outra função, como sprintf

Noé
fonte
0

Eu me deparei com essa pergunta ao pesquisar no Google para ver o que o conjunto memset retornou.

Eu tenho algum código onde teste um valor, então, se for verdade, teste para ver se um valor é zeros.

Como não existe uma maneira totalmente portátil em C de testar zeros, tenho que executar o memset no meio.

Então, meu código é:

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

Isso se refere ao propósito do encadeamento listado nas questões anteriores, mas é um exemplo de uso para essa técnica.

Vou deixar para os outros julgarem se essa codificação é boa ou não.

Gerard Nicol
fonte