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?



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.


122

Ini dapat digunakan untuk rantai panggilan seperti:

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

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.