Công dụng của giá trị trả về memset () là gì?


89

memset()được khai báo để trả về void*luôn có cùng giá trị với địa chỉ được truyền vào hàm.

Giá trị trả về có công dụng gì? Tại sao nó không trở lại void?



2
Công dụng của giá trị trả về là strcat()gì? Đôi khi, các hàm tiêu chuẩn là những gì chúng được chỉ định, không phải là những gì chúng phải như vậy.
DevSolar

4
@MatthieuM: Ngoài ra, thường có một chi phí khác không liên quan đến việc trả lại đồ. Ngay cả khi giá trị trả về phù hợp với một thanh ghi, bạn thường cần tải giá trị đó vào thanh ghi. Điều này có một chi phí, tuy nhiên nhỏ.
NPE

15
@sharptooth: Tất nhiên, hàm "giết tất cả con người" sẽ trả về số lượng người đã bị giết.
indiv

2
@MatthieuM: Bạn sẽ không lo lắng về những câu đố như vậy, nhưng tôi chắc chắn có thể. Điều gì sẽ xảy ra nếu tôi đang viết một trình biên dịch cho một hệ thống tài nguyên hạn chế? Hmmm?
Thomas Eding

Câu trả lời:


36

Chữ ký là phù hợp với tất cả các chức năng tương tự khác: memcpy(), strcpy()vv Tôi luôn luôn nghĩ rằng điều này đã được thực hiện để kích hoạt một cuộc gọi chuỗi chức năng như vậy, và nếu không sử dụng các cuộc gọi như vậy trong biểu thức.

Điều đó nói rằng, tôi chưa bao giờ gặp phải tình huống trong thế giới thực mà tôi cảm thấy bị bắt buộc phải sử dụng giá trị trả về theo cách như vậy.


122

Nó có thể được sử dụng cho chuỗi cuộc gọi như:

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

9
Vâng, đó chắc chắn là trường hợp sử dụng 'chuỗi'.
Cartesius00

6
Tôi đã ủng hộ câu trả lời, vì đó là một trường hợp thú vị. Nhưng trong cuộc sống thực, tôi nghĩ tốt hơn là nên giữ các cuộc gọi memset và strcpy riêng biệt.
Tsvetomir Dimitrov 12/12/12

26
Các lập trình viên C yêu thích mã không thể đọc được, vì vậy việc cho phép chuỗi vô hạn là điều bắt buộc khi thiết kế một hàm tiêu chuẩn.
Chad Schouggins 13/12/12

@ChadSchouggins đọc một số mã Haskell và bạn biết rằng c-lập trình viên là thực sự khá đúng nguyên văn;) (nghĩ về regex "điều hành" = ~) ...
BitTickler

Tất nhiên trong ví dụ này, nó sẽ có ý nghĩa hơn, strcpyngược lại , nếu trả về con trỏ qua cái cuối cùng được sao chép. memset(my_strcpy(a, "bla"), 0, a + 200);(thích std::copy_nstd::fill_nlàm trong C ++).
alfC

12

Để sử dụng hàm làm đối số cho một hàm khác, chẳng hạn như sprintf


1

Tôi gặp câu hỏi này khi Googling để xem bộ nhớ nào trả về.

Tôi có một số mã nơi tôi kiểm tra một giá trị, sau đó nếu đó là đúng, hãy kiểm tra xem giá trị có phải là số không hay không.

Bởi vì không có cách nào hoàn toàn di động trong C để kiểm tra số không, tôi phải chạy memset ở giữa.

Vì vậy, mã của tôi là:

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

Điều này nói lên mục đích chuỗi được liệt kê trong các câu hỏi trước, nhưng nó là một ví dụ về việc sử dụng kỹ thuật này.

Tôi sẽ để người khác đánh giá xem đây có phải là mã hóa tốt hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.