Apa gunanya nilai pengembalian memset ()?

90

memset()dideklarasikan untuk mengembalikan nilai void*yang selalu sama dengan alamat yang diteruskan ke fungsi.

Apa gunanya nilai kembali? Mengapa tidak kembali void?

gigi tajam
sumber
2
Apa gunanya nilai kembali strcat()? Terkadang, fungsi standar adalah apa yang ditentukan, bukan apa yang seharusnya .
DevSolar
4
@MatthieuM .: Selain itu, biasanya ada biaya tidak nol yang terkait dengan pengembalian barang. Meskipun nilai yang dikembalikan cocok dengan register, Anda biasanya perlu memuat nilai itu ke register. Ini memiliki biaya, betapapun kecilnya.
NPE
15
@sharptooth: Fungsi "bunuh semua manusia" akan mengembalikan jumlah manusia yang terbunuh, tentu saja.
indiv
2
@ MatthieuM .: Anda tidak akan khawatir tentang hal-hal sepele seperti itu, tetapi saya pasti mungkin. Bagaimana jika saya menulis kompiler untuk sistem sumber daya terbatas? Hmmm?
Thomas Eding

Jawaban:

36

Tanda tangan ini sejalan dengan semua fungsi serupa lainnya: memcpy(), strcpy()dll Saya selalu berpikir ini dilakukan untuk memungkinkan seseorang untuk panggilan rantai untuk fungsi tersebut, dan untuk sebaliknya menggunakan panggilan tersebut dalam ekspresi.

Meskipun demikian, saya tidak pernah menemukan situasi dunia nyata di mana saya merasa harus menggunakan nilai pengembalian dengan cara seperti itu.

NPE
sumber
122

Ini dapat digunakan untuk rantai panggilan seperti:

char a[200];
strcpy(memset(a, 0, 200), "bla");
Juraj Blaho
sumber
9
Ya, ini jelas merupakan kasus penggunaan 'rantai'.
Cartesius00
6
Saya telah memilih jawabannya, karena ini kasus yang menarik. Namun dalam kehidupan nyata, saya pikir lebih baik memisahkan panggilan memset dan strcpy.
Tsvetomir Dimitrov
26
Pemrogram C menyukai kode yang tidak dapat dibaca, jadi mengizinkan rangkaian tanpa batas adalah suatu keharusan saat mendesain fungsi standar.
Chad Schouggins
@ChadSchouggins Baca beberapa kode haskell dan Anda tahu bahwa c-programmer sebenarnya cukup kata demi kata;) (pikirkan regex "operator" = ~) ...
BitTickler
Tentu saja dalam contoh ini akan lebih masuk akal bahkan, sebaliknya, untuk strcpymengembalikan penunjuk melewati yang terakhir disalin. memset(my_strcpy(a, "bla"), 0, a + 200);(suka std::copy_ndan std::fill_nlakukan di C ++).
alfC
12

Untuk menggunakan fungsi tersebut sebagai argumen untuk fungsi lain seperti sprintf

Nuh
sumber
1

Saya menemukan pertanyaan ini ketika Googling untuk melihat memset apa yang dikembalikan.

Saya memiliki beberapa kode di mana saya menguji satu nilai, kemudian jika itu adalah tes yang benar untuk melihat apakah nilainya nol.

Karena tidak ada cara yang sepenuhnya portabel di C untuk menguji nol, saya harus menjalankan memset di tengah.

Jadi kode saya adalah:

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

Ini berbicara tentang tujuan rangkaian yang tercantum dalam pertanyaan sebelumnya, tetapi ini adalah contoh penggunaan teknik ini.

Saya akan menyerahkan kepada orang lain untuk menilai apakah ini pengkodean yang baik atau tidak.

Gerard Nicol
sumber