2012-12-05 38 views
85

memset() được khai báo trả về void* luôn có cùng giá trị với địa chỉ được chuyển vào hàm.Việc sử dụng giá trị trả về() trả về là gì?

Việc sử dụng giá trị trả lại là gì? Tại sao nó không trả lại void?

+0

Nhất quán với các hàm 'mem *' khác có lẽ chủ yếu trả về 'void *'? –

+9

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

+0

@BoBTFish Liên kết đẹp. – Cartesius00

Trả lời

33

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 nghĩ này đã được thực hiện để cho phép một cuộc gọi chuỗi các chức năng như vậy, và để sử dụng các cuộc gọi như vậy trong các biểu thức khác.

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

115

Nó có thể được sử dụng cho cuộc gọi chaining 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 đã upvoted câu trả lời, bởi vì nó 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ữ riêng các cuộc gọi memcpy và memcpy. –

+23

Các lập trình viên C yêu mã không thể đọc được, vì vậy cho phép chuỗi vô hạn là phải khi thiết kế một hàm chuẩn. –

12

Để sử dụng chức năng như một tham số cho một chức năng như sprintf

0

Tôi đã xem qua câu hỏi này khi Googling để xem những gì memset trả lại.

Tôi có một số mã mà tôi thử nghiệm cho một giá trị, sau đó nếu đó là kiểm tra đúng để xem liệu giá trị có phải là số không.

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 chaining được liệt kê trong câu hỏi trước, nhưng nó là một ví dụ về sử dụng cho kỹ thuật này.

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

Các vấn đề liên quan