2009-10-08 60 views
12

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

+2

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

+0

http://www.cplusplus.com/ cũng có tài liệu tham khảo trực tuyến rất tốt. – Amber

+1

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++ ... –

Trả lời

34

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.

+11

Đ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

+1

hoàn toàn. lấy ví dụ này như một ví dụ. – Peter

+2

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

14

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| 
* +-+-+-+-+ 
*/ 
+0

Có thể đáng chú ý rằng 'sizeof (char)' là '1' theo định nghĩa, vì vậy' sizeof (char) * 's là thừa. – emlai

+0

@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

+3

'sizeof a' và' sizeof c' tương ứng, mạnh mẽ hơn việc sử dụng số ma thuật –

3

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 memcpymemmove. 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.

2

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.

0

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);

0

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);

Reference memcpy memset

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