A cosa serve il valore di ritorno di memset ()?


90

memset()viene dichiarato per restituire void*che è sempre lo stesso valore dell'indirizzo passato alla funzione.

Qual è l'uso del valore di ritorno? Perché non ritorna void?



2
A cosa serve il valore di ritorno strcat()? A volte, le funzioni standard sono ciò che devono essere specificate, non ciò che dovrebbero essere.
DevSolar

4
@ MatthieuM .: Inoltre, generalmente c'è un costo diverso da zero associato alla restituzione delle cose. Anche se il valore restituito rientra in un registro, generalmente è necessario caricare quel valore nel registro. Questo ha un costo, per quanto piccolo.
NPE

15
@sharptooth: una funzione "uccidi tutti gli umani" restituirebbe il numero di umani uccisi, ovviamente.
indiv

2
@MatthieuM .: Lei non mi preoccuperei come curiosità, ma io di certo potrebbe. E se sto scrivendo un compilatore per un sistema di risorse limitate? Hmmm?
Thomas Eding

Risposte:


36

La firma è in linea con tutte le altre funzioni simili: memcpy(), strcpy()ecc Ho sempre pensato che questo è stato fatto per consentire uno a chiamate a catena a tali funzioni, e ad utilizzare in altro modo tali chiamate nelle espressioni.

Detto questo, non mi sono mai imbattuto in una situazione del mondo reale in cui mi sentirei obbligato a utilizzare il valore di ritorno in questo modo.


122

Può essere utilizzato per il concatenamento delle chiamate come:

char a[200];
strcpy(memset(a, 0, 200), "bla");

9
Sì, è sicuramente il caso d'uso "concatenato".
Cartesius00

6
Ho votato contro la risposta, perché è un caso interessante. Ma nella vita reale penso che sia meglio tenere separate le chiamate memset e strcpy.
Tsvetomir Dimitrov

26
I programmatori C amano il codice illeggibile, quindi consentire il concatenamento infinito è un must quando si progetta una funzione standard.
Chad Schouggins

@ChadSchouggins Leggi un po 'di codice haskell e sai che i programmatori C sono in realtà abbastanza testuali;) (pensa
all'espressione regolare

Ovviamente in questo esempio avrebbe avuto più senso anche, al contrario, strcpyriportare il puntatore oltre l'ultimo copiato. memset(my_strcpy(a, "bla"), 0, a + 200);(come std::copy_ne std::fill_nfai in C ++).
alfC

12

Per utilizzare la funzione come argomento per un'altra funzione come sprintf


1

Mi sono imbattuto in questa domanda quando ho cercato su Google per vedere quale memset è tornato.

Ho del codice in cui provo un valore, quindi se questo è vero prova per vedere se un valore è zero.

Poiché non esiste un modo completamente portabile in C per testare gli zeri, devo eseguire memset nel mezzo.

Quindi il mio codice è:

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

Questo parla dello scopo del concatenamento elencato nelle domande precedenti, ma è un esempio di utilizzo di questa tecnica.

Lascerò ad altri il compito di giudicare se questa è una buona codifica o meno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.