【发布时间】:2014-01-18 13:42:55
【问题描述】:
在以下场景中使用memcpy 是否安全,其中将数据从较大的索引复制到同一块中的较小索引的块中。例如:
char buf[100];
// fill in the data ...
memcpy(&buf[10], &buf[15], 10);
在上述情况下,我不关心位置 10 - 19 的数据,如果它被覆盖就可以了。有什么理由应该避免这种情况并改用memmove吗?
编辑:抱歉,我没有正确传达我的意图,所以假设我有来自索引 10 - 19 的数据和来自索引 15 - 24 的数据,我想从 15 - 24 复制 10 - 19 的数据,但我没有不关心 10 到 19 的数据,即使它们重叠,对我们 memcpy 是否安全?
【问题讨论】:
-
不会重叠 -
memcpy(&buf[20], &buf[10], 20);会 -
对不起,我的意思是反过来,把它固定在上面。
-
如果A和B不重叠,那么B和A也不重叠...
-
如果有重叠,memcpy()s 的行为是未定义的。对于 memmove(),可以保证正确的行为。
-
@wildplasser 是不是因为没有定义每个字节的复制顺序?