Tôi đã đọc các tiêu đề chức năng, nhưng tôi vẫn không chắc chắn về sự khác biệt chính xác về mặt các trường hợp sử dụng.Sự khác nhau giữa memset và memcpy trong C
Trả lời
memcpy()
sao từ địa điểm này sang địa điểm khác. memset()
chỉ đặt tất cả các phần bộ nhớ vào cùng một giá trị.
Ví dụ:
memset(str, '*', 50);
Dòng trên đặt 50 ký tự đầu tiên của chuỗi str để * (hoặc bất kỳ đối số thứ hai của memset).
memcpy(str2, str1, 50);
Dòng trên sao chép 50 ký tự đầu tiên của str1 đến str2.
Điều đáng chú ý là các hàm mem *() * không * biết về các thuật ngữ chuỗi. Ví dụ thứ hai ở trên sẽ làm những điều xấu nếu str1 ngắn hơn 50 ký tự. Chỉ an toàn khi sử dụng các hàm mem *() trên dữ liệu chuỗi khi bạn đã xác thực độ dài liên quan. – unwind
hoàn toàn. lấy ví dụ này như một ví dụ. – Peter
nó có thể là giá trị chỉ ra rằng nếu bạn muốn sao chép hai chuỗi sử dụng: strncpy (str2, str1, 50); Điều này sẽ sao chép an toàn str1 sang str2 dừng bản sao tại đầu cuối chuỗi '\ 0' đầu tiên nó phát hiện trong str1, nhưng có mạng lưới an toàn mà nó sẽ không sao chép quá 50 ký tự nên str1 bị hỏng hoặc dài hơn 50 byte. – EndsOfInvention
memset()
đặt tất cả các byte trong bộ đệm được chỉ định thành cùng một giá trị, memcpy()
sao chép chuỗi các byte từ một vị trí khác vào bộ đệm.
char a[4];
memset(a, 7, sizeof(char)*4);
/*
* a is now...
*
* +-+-+-+-+
* |7|7|7|7|
* +-+-+-+-+
*/
char b[] = {1,2,3,4};
char c[4];
memcpy(c, b, sizeof(char)*4);
/*
* c is now...
*
* +-+-+-+-+
* |1|2|3|4|
* +-+-+-+-+
*/
Có thể đáng chú ý rằng 'sizeof (char)' là '1' theo định nghĩa, vì vậy' sizeof (char) * 's là thừa. – emlai
@zenith chắc chắn, cho ví dụ cụ thể, nhưng đó là tất cả niềm vui và trò chơi cho đến khi ai đó giả định rằng ints là kích thước cố định quá. – Amber
'sizeof a' và' sizeof c' tương ứng, mạnh mẽ hơn việc sử dụng số ma thuật –
memset
đặt một khối bộ nhớ thành một giá trị. memcpy
sao chép nội dung của một khối vào khối khác.
Có lẽ bạn sẽ quan tâm đến sự khác biệt giữa memcpy
và memmove
. Cả hai đều làm như vậy, nhưng sau này hoạt động ngay cả khi nguồn và đích trùng lặp.
memset()
được sử dụng để đặt tất cả các byte trong một khối bộ nhớ thành một giá trị char cụ thể. Memset cũng chỉ chơi tốt với char
vì nó là giá trị khởi tạo của nó.
memcpy()
sao chép byte giữa bộ nhớ. Loại dữ liệu được sao chép này không liên quan, nó chỉ tạo các bản sao byte-byte.
memcpy()
sao từ địa điểm này sang địa điểm khác. memset()
chỉ cần đặt tất cả các phần của bộ nhớ giống nhau.
Ví dụ ở đây đặt chiều dài chuỗi của chuỗi thành * (hoặc bất kỳ đối số thứ hai nào của bộ nhớ).
memset(str, '*', strlen(str)+1);
Ở đây sao chép độ dài chuỗi của chuỗi src thành dest.
memcpy(dest, src, strlen(src)+1);
memset điền nhớ với byte liên tục
void * memset (void * s, int c, size_t n);
Sử dụng memset là lập trình viên có thể trực tiếp lấp đầy bộ nhớ cụ thể. và sử dụng memcpy hằng số con trỏ trống vào nguồn không thể thay đổi được.
memcpy sao chép bộ nhớ khu vực
void * memcpy (void * dest, const void * src, size_t n);
- 1. Sự khác biệt giữa strncpy và memcpy?
- 2. Sự khác nhau giữa C: và C:/
- 3. Sự khác nhau giữa `% trong%` và `== '
- 4. Sự khác nhau giữa Convert.ToString() và .ToString() trong C#?
- 5. có sự khác nhau giữa [Serializable] và [Serializable()] trong C#?
- 6. Sự khác nhau giữa C# và visual C# là gì?
- 7. Sự khác nhau giữa Java và C# và .NET
- 8. Sự khác nhau giữa! = Và =! trong Java?
- 9. Sự khác nhau giữa | và || trong MATLAB?
- 10. Sự khác nhau giữa System.DateTime.Now và System.DateTime.Today
- 11. Sự khác nhau giữa JAVA_HOME và JRE_HOME
- 12. Sự khác nhau giữa 'SpecialFolder.LocalApplicationData' và 'SpecialFolder.ApplicationData'?
- 13. Sự khác nhau giữa OTL và SOCI
- 14. Sự khác nhau giữa Shadows (VB.NET) và New (C#)
- 15. Sự khác nhau giữa Ctrl-C và SIGINT là gì?
- 16. Sự khác nhau giữa ElapsedTicks, ElapsedMilliseconds, Elapsed.Milliseconds và Elapsed.TotalMilliseconds? (C#)
- 17. Sự khác nhau giữa PyMODINIT_FUNC và PyModule_Create
- 18. Sự khác nhau giữa Tkinter và Tkinter
- 19. Sự khác nhau giữa dbcontext.Add và dbcontext.AddObject
- 20. Sự khác nhau giữa C#, .NET và CLI là gì?
- 21. Sự khác nhau giữa Objective-C và Cocoa là gì?
- 22. C#: Sự khác nhau giữa '+ = anEvent' và '+ = new EventHandler (anEvent)'
- 23. Sự khác nhau giữa SpVoice và SpeechSynthesizer
- 24. Sự khác nhau giữa TVar và TMVar
- 25. Sự khác nhau giữa NoClassDefFoundError và ClassNotFoundException?
- 26. sự khác nhau giữa XSD và WSDL
- 27. Sự khác nhau giữa String.scan và String.split
- 28. Sự khác nhau giữa presentModalViewController và presentViewController?
- 29. Sự khác nhau giữa System.Web.Cache và HTTPContext.Curent.Cache
- 30. Sự khác nhau giữa onClickListener và onItemClickListener
Các tiêu đề không phải là thường là nơi tốt nhất để tìm kiếm tài liệu. Trong trường hợp của C, tham chiếu cuối cùng là tiêu chuẩn, nhưng bất kỳ văn bản tham chiếu phong nha nào (ví dụ: K & R, H & S) sẽ mô tả các hàm thư viện chuẩn đầy đủ. – mlp
http://www.cplusplus.com/ cũng có tài liệu tham khảo trực tuyến rất tốt. – Amber
hoặc opengroup.org (điều chỉnh tiêu chuẩn POSIX). Nếu bạn sử dụng cplusplus.com, bạn phải bỏ qua những thứ về C++ ... –