2011-09-16 84 views
9

在原型的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的內容將被改變,違反了常量空隙/炭*?

回答

20

const void*表示通過該指針不會修改

如果還有其他非const指針指向同一個對象(也稱爲「別名」),那麼當然它仍然可以通過這些修改。在你描述的場景中,另一個指針是dest

順便說一下,在strcpy的情況下,如果區域重疊,則行爲是不確定的,並且在C99中籤名是char *strcpy(char * restrict s1, const char * restrict s2);。但對於移除,別名是確定的。通過給它重疊的區域,你已經給它「許可」來修改dest區域,它會這樣做。

+0

同意,這是正確的。 – Alcott

+0

你的意思是,如果我不能確定dest和src是否重疊,我最好不要使用strcpy,對吧? – Alcott

+1

@Alcott:沒錯。你在實踐中最可能看到的是,如果你的區域與'dest

4

這意味着memmove保證它不會直接修改通過src指向的內存。

當然,如果兩個塊重疊memmove將改變所謂的「const」內存。 const是附加到名稱的ca合同。沒有辦法讓實際的內存只讀。

+0

@downvoter關注意見? – cnicutar

+0

根據您的編輯刪除downvote。 –

+0

@Praetorian我經常不知道我在說什麼,但我喜歡評論,所以我可以學習:-) – cnicutar

7

參數標記爲const void *,表示memmove將永遠不會使用該指針修改由src指向的內存。如果發生重疊,則使用dest指針而不是src指針修改存儲器,所以不會違反擔保。

3

如上所述,memove不會通過「src」指針修改內存的內容,而是通過「dest」指針修改內存的內容。

const指的是如何使用指針,它不會添加任何內存保護。

如果兩個指針都指向內存的重疊區域,那麼如果副本將從「src」開始並從「src + n」開始遞增並遞減,則未定義任何內容。

+0

對不起,看起來像我同時發佈的重複答案上面編輯 –

+0

這種事情總是發生,這不是一個問題。答案通常存在微妙的差異,即使它們基本相同,通常對相同的事物有幾個解釋是相當有用的 - 一個讀者會理解其中一個最好,其他人會理解另一個。 –