在原型的memmove/memcpy的/ strcpy的第二ARG是相似的: 例如:「const void *」在memmove中意味着什麼?
void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
但很顯然,如果dest和src重疊,然後SRC的內容將被改變,違反了常量空隙/炭*?
在原型的memmove/memcpy的/ strcpy的第二ARG是相似的: 例如:「const void *」在memmove中意味着什麼?
void *memmove(void *dest, const void *src, size_t n); //const void*
char *strcpy(char *dest, const char *src); //const char*
但很顯然,如果dest和src重疊,然後SRC的內容將被改變,違反了常量空隙/炭*?
const void*
表示通過該指針不會修改。
如果還有其他非const指針指向同一個對象(也稱爲「別名」),那麼當然它仍然可以通過這些修改。在你描述的場景中,另一個指針是dest
。
順便說一下,在strcpy
的情況下,如果區域重疊,則行爲是不確定的,並且在C99中籤名是char *strcpy(char * restrict s1, const char * restrict s2);
。但對於移除,別名是確定的。通過給它重疊的區域,你已經給它「許可」來修改dest
區域,它會這樣做。
參數標記爲const void *
,表示memmove
將永遠不會使用該指針修改由src
指向的內存。如果發生重疊,則使用dest
指針而不是src
指針修改存儲器,所以不會違反擔保。
如上所述,memove不會通過「src」指針修改內存的內容,而是通過「dest」指針修改內存的內容。
const指的是如何使用指針,它不會添加任何內存保護。
如果兩個指針都指向內存的重疊區域,那麼如果副本將從「src」開始並從「src + n」開始遞增並遞減,則未定義任何內容。
對不起,看起來像我同時發佈的重複答案上面編輯 –
這種事情總是發生,這不是一個問題。答案通常存在微妙的差異,即使它們基本相同,通常對相同的事物有幾個解釋是相當有用的 - 一個讀者會理解其中一個最好,其他人會理解另一個。 –
同意,這是正確的。 – Alcott
你的意思是,如果我不能確定dest和src是否重疊,我最好不要使用strcpy,對吧? – Alcott
@Alcott:沒錯。你在實踐中最可能看到的是,如果你的區域與'dest