2011-09-16 44 views
9

Các arg thứ hai trong nguyên mẫu cho memmove/memcpy/strcpy tương tự: Ví dụ:"const void *" nghĩa là gì trong memmove?

void *memmove(void *dest, const void *src, size_t n); //const void* 
char *strcpy(char *dest, const char *src); //const char* 

Nhưng dường như, nếu dest và src chồng chéo, sau đó nội dung src sẽ được thay đổi, vi phạm khoảng trống const/char *?

Trả lời

20

const void* nghĩa là giới thiệu sẽ không bị sửa đổi thông qua con trỏ đó.

Nếu có các con trỏ khác, không liên kết đến cùng một đối tượng (còn được gọi là "răng cưa"), thì tất nhiên nó vẫn có thể được sửa đổi thông qua các đối tượng đó. Trong kịch bản bạn mô tả, con trỏ kia là dest.

Nhân tiện, trong trường hợp strcpy, hành vi không xác định nếu các vùng chồng lên nhau và trong C99 chữ ký là char *strcpy(char * restrict s1, const char * restrict s2);. Nhưng đối với memmove, răng cưa là OK. Bằng cách cho nó vùng chồng chéo bạn đã cho nó "quyền" để sửa đổi vùng dest, và nó sẽ làm điều đó.

+0

đồng ý, đúng vậy. – Alcott

+0

bạn có nghĩa là, nếu tôi không thể chắc chắn cho dù dest và src chồng chéo hay không, tôi tốt hơn không sử dụng strcpy , phải không? – Alcott

+1

@Alcott: đúng vậy. Những gì bạn có thể thấy trong thực tế là nếu các vùng của bạn chồng chéo với 'dest

4

Điều đó có nghĩa là memmove đảm bảo rằng nó sẽ không trực tiếp sửa đổi bộ nhớ được chỉ bởi src.

Tất nhiên nếu hai khối chồng lên nhau memmove sẽ thay đổi bộ nhớ "const". const là hợp đồng ca kèm theo tên. Không có cách nào để làm cho bộ nhớ thực chỉ đọc.

+0

@downvoter Chăm sóc để nhận xét? – cnicutar

+0

Đã xóa ghi đè dựa trên chỉnh sửa của bạn. –

+0

@Praetorian Tôi thường không biết mình đang nói về điều gì nhưng tôi thích nhận xét để tôi có thể học :-) – cnicutar

7

Đối số được đánh dấu const void * để cho biết memmove sẽ không bao giờ sửa đổi bộ nhớ được trỏ đến bằng src bằng cách sử dụng con trỏ đó. Nếu chồng chéo xảy ra, bộ nhớ được sửa đổi bằng cách sử dụng con trỏ dest, không phải con trỏ src, do đó đảm bảo không bị vi phạm.

3

Khi ghi nhớ ở trên sẽ không sửa đổi nội dung của bộ nhớ thông qua con trỏ "src" nhưng sẽ thông qua con trỏ "dest".

const đề cập đến cách các con trỏ được sử dụng, nó không thêm bất kỳ sự bảo vệ bộ nhớ nào.

Nếu cả hai con trỏ trỏ đến vùng chồng chéo của bộ nhớ thì mọi thứ có thể xảy ra vì nó không được xác định nếu bản sao sẽ bắt đầu từ "src" và tăng hoặc bắt đầu từ "src + n" và giảm.

+0

xin lỗi vì trông giống như một câu trả lời lặp lại bởi tôi được đăng cùng một lúc ở trên đã được chỉnh sửa –

+0

điều đó xảy ra mọi lúc, nó không phải là một vấn đề. Thường có những khác biệt tinh tế trong câu trả lời ngay cả khi chúng giống nhau, và thường khá hữu ích khi có một số giải thích về cùng một điều - một người đọc sẽ hiểu một trong số chúng tốt nhất, người khác sẽ hiểu người khác. –

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