2012-12-05 21 views
85

memset() zadeklarowano, że zwraca void*, która zawsze ma tę samą wartość, co adres przekazany do funkcji.Jaka jest wartość zwracana przez memset()?

Jaki jest pożytek z zwracanej wartości? Dlaczego nie zwraca ona void?

+0

Spójność z innymi funkcjami 'mem *', które prawdopodobnie w większości zwracają 'void *'? –

+9

http://thevirtualmachinist.blogspot.co.uk/2010/08/whats-return-value-of-memset.html – BoBTFish

+0

@BoBTFish Nice link. – Cartesius00

Odpowiedz

33

Podpis jest zgodny ze wszystkimi innymi podobnymi funkcjami: memcpy(), strcpy() itp Zawsze myślałem Zrobiono to, aby umożliwić jeden do połączeń łańcuchowych do takie funkcje i w przeciwnym razie używać takich wywołań w wyrażeniach.

To powiedziawszy, nigdy nie spotkałem się z rzeczywistą sytuacją, w której czułbym się zmuszony do używania wartości zwrotu w taki sposób.

115

może być używany do połączenia łańcuchowego jak:

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

Tak, zdecydowanie jest to przypadek użycia "łańcuchowego". – Cartesius00

+6

Poprawiłem odpowiedź, ponieważ jest to interesujący przypadek. Ale w prawdziwym życiu uważam, że lepiej jest zachować oddzielenie połączeń i połączeń. –

+23

Programiści C kochają nieczytelny kod, więc umożliwienie nieskończonego łączenia jest koniecznością podczas projektowania standardowej funkcji. –

12

Aby korzystać z funkcji jako argumentu innej funkcji, takich jak sprintf

0

natknąłem to pytanie, gdy Googling zobaczyć co memset zwrócone.

Mam pewien kod, w którym testuję jedną wartość, a następnie, jeśli jest to prawdziwy test, aby sprawdzić, czy wartość jest zerowa.

Ponieważ nie ma całkowicie przenośnej drogi w C, aby przetestować zera, muszę uruchomić memset w środku.

Więc mój kod jest:

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

To przemawia do celów łańcuchowym wymienionych w poprzednich pytaniach, ale jest przykładem zastosowania tej techniki.

Zostawię to innym, aby ocenić, czy to dobre kodowanie, czy nie.

Powiązane problemy