2017-04-19 28 views
2

我使用memmove(),但似乎目的地覆蓋源或也許我不明白是什麼重寫。我有char(目的地)的數組,然後一個指針到目的地,即所述載體內。memmove與overlaping

char destination[]="abcdefg"; 
char * source = destination+3; 

來源是"defg"。然後我使用memmove()移動四個字符並打印源文件。當我查看源代碼時,它已更改爲"gefg"

printf("%s\n",memmove(destination,source,sizeof(char)*4)); 
printf("%s",source); 

我以爲memmove()應該防止覆蓋,或者我不理解。

+0

也許你應該看看目的地,而不是在源(這仍然是什特+ 3)。 (注:'的sizeof(char)的'是1,根據定義) – wildplasser

+2

'memmove'意味着複製字節即使區域重疊 –

+1

是的,我很抱歉,是覆蓋不重疊。 –

回答

2

memmove允許源和目的地具有重疊的區域,它被限定爲使得所述源的memmove之前的內容將比較等於memmove後目的地的內容。

如果源和目標重疊,你會期望源以某種方式memmove電話後發生了變化。防止目標可能的腐敗。

memmove(dst, src, len)行爲將類似於:

char buf[len]; 
memcpy(buf, src, len); 
memcpy(dst, buf, len); 

但實現優化,使得只有一個傳球,而不是兩個。