Jakie jest zastosowanie wartości zwracanej przez memset ()?

90

memset()zadeklarowano, void*że zwraca zawsze tę samą wartość, co adres przekazany do funkcji.

Jaki jest pożytek ze zwracanej wartości? Dlaczego nie wraca void?

ostry
źródło
2
Jaki jest pożytek ze zwracanej wartości strcat()? Czasami standardowe funkcje są tym, czym są określone, a nie tym, czym powinny .
DevSolar
4
@MatthieuM .: Ponadto zwrot kosztów jest zazwyczaj niezerowy. Nawet jeśli zwracana wartość mieści się w rejestrze, generalnie trzeba załadować tę wartość do rejestru. Ma to jednak niewielki koszt.
NPE
15
@sharptooth: Funkcja „zabij wszystkich ludzi” zwróciłaby oczywiście liczbę zabitych ludzi.
indyw
2
@MatthieuM .: Ty nie martwiłbym się o takiej ciekawostki, ale ja na pewno może. Co jeśli piszę kompilator dla systemu z ograniczonymi zasobami? Hmmm?
Thomas Eding,

Odpowiedzi:

36

Podpis jest zgodny ze wszystkimi innymi podobnymi funkcjami: memcpy(), strcpy()itd. Zawsze myślałem, że to zostało zrobione w celu umożliwienia jeden do połączeń łańcuchowych do takich funkcji, a także w inny sposób korzystać z takich połączeń w wyrażeniach.

To powiedziawszy, nigdy nie spotkałem się z sytuacją w świecie rzeczywistym, w której czułbym się zmuszony do wykorzystania wartości zwracanej w taki sposób.

NPE
źródło
122

Może być używany do łączenia połączeń, takich jak:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Juraj Blaho
źródło
9
Tak, to zdecydowanie przypadek użycia „łańcuchowego”.
Cartesius00,
6
Głosowałem za odpowiedzią, bo to ciekawy przypadek. Ale w prawdziwym życiu myślę, że lepiej jest trzymać połączenia memset i strcpy oddzielnie.
Tsvetomir Dimitrov
26
Programiści C uwielbiają nieczytelny kod, więc pozwolenie na nieskończone tworzenie łańcuchów jest koniecznością podczas projektowania standardowej funkcji.
Chad Schouggins,
@ChadSchouggins Przeczytaj trochę kodu haskell i wiesz, że c-programiści są w rzeczywistości całkiem dosłownie;) (myśli o wyrażeniu regularnym "operator" = ~) ...
BitTickler
Oczywiście w tym przykładzie byłoby nawet bardziej sensowne, odwrotnie, gdyby strcpywskaźnik znalazł się poza ostatnio skopiowanym plikiem. memset(my_strcpy(a, "bla"), 0, a + 200);(jak std::copy_ni std::fill_nzrób w C ++).
alfC
12

Aby użyć funkcji jako argumentu dla innej funkcji, takiej jak sprintf

Noe
źródło
1

Natknąłem się na to pytanie, szukając w Google, aby zobaczyć, jaki memset powrócił.

Mam kod, w którym testuję dla jednej wartości, a jeśli to prawda, sprawdź, czy wartość jest zerowa.

Ponieważ w C nie ma całkowicie przenośnego sposobu na testowanie zer, muszę uruchomić memset w środku.

Więc mój kod to:

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

Odpowiada to celowi łączenia w łańcuchy wymienionemu w poprzednich pytaniach, ale jest to przykład zastosowania tej techniki.

Zostawię to innym, aby ocenili, czy to jest dobre kodowanie, czy nie.

Gerard Nicol
źródło