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
?
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
?
strcat()
? Czasami standardowe funkcje są tym, czym są określone, a nie tym, czym powinny .
Odpowiedzi:
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.
Może być używany do łączenia połączeń, takich jak:
char a[200];
strcpy(memset(a, 0, 200), "bla");
strcpy
wskaźnik znalazł się poza ostatnio skopiowanym plikiem. memset(my_strcpy(a, "bla"), 0, a + 200);
(jak std::copy_n
i std::fill_n
zrób w C ++).
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.