Memmove重叠

时间:2017-04-19 23:45:05

标签: c

我正在使用memmove(),但似乎目的地正在覆盖源或者我不明白覆盖是什么。我有一个char(目的地)数组,然后是一个指向目的地的指针,它位于矢量内。

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

来源为"defg"。然后我使用memmove()移动四个字符并打印源。当我查看源代码时,它已更改为"gefg"

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

我认为memmove()应该阻止覆盖,或者我可能不理解。

1 个答案:

答案 0 :(得分:3)

memmove允许源和目标具有重叠区域,并且定义它以使memmove之前的源内容在memmove之后比较等于目标的内容}。

如果源和目标重叠,您会发现在memmove调用后,源会以某种方式发生更改。可以预防的是可能的目的地腐败。

memmove(dst, src, len)的行为类似于:

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

但是实现被优化为只进行一次传递,而不是两次传递。