การใช้ memset () return value คืออะไร?


90

memset()จะถูกประกาศให้ส่งคืนvoid*ซึ่งเป็นค่าเดียวกับที่อยู่ที่ส่งผ่านไปยังฟังก์ชันเสมอ

การใช้คืนมูลค่าคืออะไร? ทำไมมันไม่กลับมาvoid?



2
การใช้คืนมูลค่าstrcat()คืออะไร? บางครั้งฟังก์ชันมาตรฐานคือสิ่งที่ระบุไว้ไม่ใช่สิ่งที่ควรเป็น
DevSolar

4
@ MatthieuM: นอกจากนี้โดยทั่วไปแล้วจะมีค่าใช้จ่ายที่ไม่ใช่ศูนย์ที่เกี่ยวข้องกับการส่งคืนสิ่งของ แม้ว่าค่าที่ส่งคืนจะพอดีกับรีจิสเตอร์ แต่โดยทั่วไปคุณต้องโหลดค่านั้นลงในรีจิสเตอร์ สิ่งนี้มีค่าใช้จ่ายเล็กน้อย
NPE

15
@sharptooth: ฟังก์ชัน "ฆ่ามนุษย์ทั้งหมด" จะคืนจำนวนมนุษย์ที่ถูกฆ่าแน่นอน
indiv

2
@ MatthieuM: คุณไม่ต้องกังวลกับเรื่องไม่สำคัญเช่นนี้ แต่ฉันอาจทำได้อย่างแน่นอน จะเป็นอย่างไรหากฉันเขียนคอมไพเลอร์สำหรับระบบทรัพยากรที่ จำกัด หืม?
Thomas Eding

คำตอบ:


36

ลายเซ็นสอดคล้องกับฟังก์ชันอื่น ๆ ที่คล้ายกันทั้งหมด: memcpy(),strcpy()ฯลฯ ผมคิดเสมอว่านี้คือทำเพื่อเปิดใช้งานหนึ่งไปยังสายโซ่ฟังก์ชั่นดังกล่าวและจะเป็นอย่างอื่นใช้สายดังกล่าวในการแสดงออก

ที่กล่าวว่าฉันไม่เคยเจอสถานการณ์ในโลกแห่งความเป็นจริงที่ฉันรู้สึกว่าถูกบังคับให้ใช้มูลค่าผลตอบแทนในลักษณะนี้


122

อาจใช้สำหรับการผูกมัดการโทรเช่น:

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

9
ใช่มันเป็นกรณีการใช้งาน 'การผูกมัด' อย่างแน่นอน
Cartesius00

6
ฉันได้เพิ่มคะแนนคำตอบเพราะเป็นกรณีที่น่าสนใจ แต่ในชีวิตจริงฉันคิดว่าควรแยก memset และ strcpy call ออกจากกันดีกว่า
Tsvetomir Dimitrov

26
โปรแกรมเมอร์ C ชอบรหัสที่อ่านไม่ได้ดังนั้นการปล่อยให้มีการผูกมัดแบบไม่มีที่สิ้นสุดจึงเป็นสิ่งจำเป็นเมื่อออกแบบฟังก์ชันมาตรฐาน
Chad Schouggins

@ChadSchouggins อ่านโค้ด haskell แล้วคุณจะรู้ว่า c-programmers นั้นสวยทุกคำ;) (
นึกถึง

แน่นอนว่าในตัวอย่างนี้มันจะมีเหตุผลมากกว่าในทางstrcpyกลับกันสำหรับการส่งกลับตัวชี้ผ่านตัวสุดท้ายที่คัดลอก memset(my_strcpy(a, "bla"), 0, a + 200);(ชอบstd::copy_nและstd::fill_nทำใน C ++)
alfC


1

ฉันเจอคำถามนี้เมื่อ Googling เพื่อดูว่า memset ส่งคืนอะไรบ้าง

ฉันมีรหัสบางอย่างที่ฉันทดสอบสำหรับค่าหนึ่งถ้านั่นเป็นการทดสอบจริงเพื่อดูว่าค่าเป็นศูนย์หรือไม่

เนื่องจากไม่มีวิธีพกพาอย่างสมบูรณ์ใน C เพื่อทดสอบค่าศูนย์ฉันจึงต้องเรียกใช้ memset ที่อยู่ตรงกลาง

ดังนั้นรหัสของฉันคือ:

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

สิ่งนี้พูดถึงจุดประสงค์การผูกมัดที่ระบุไว้ในคำถามก่อนหน้านี้ แต่เป็นตัวอย่างของการใช้เทคนิคนี้

ฉันจะปล่อยให้คนอื่นตัดสินว่านี่เป็นการเข้ารหัสที่ดีหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.