3 回答

TA贡献1834条经验 获得超8个赞
对于您的示例没有任何奇怪的行为,我并不感到完全惊讶。尝试复制str1到str1+2,然后看看会发生什么。(实际上可能没有什么不同,取决于编译器/库。)
通常,memcpy以简单(但快速)的方式实现。简单地说,它只是按顺序循环数据,从一个位置复制到另一个位置。这可能会导致在读取源时将其覆盖。
Memmove会做更多的工作来确保正确处理重叠。
编辑:
(不幸的是,我找不到合适的例子,但是这些都可以)。对比此处显示的memcpy和memmove实现。memcpy只是循环,而memmove执行测试以确定循环方向,以免破坏数据。这些实现非常简单。大多数高性能的实现更为复杂(涉及一次复制字大小的块而不是字节)。

TA贡献1796条经验 获得超4个赞
中的内存memcpy 不能重叠,否则您可能会面临不确定的行为,而其中的内存memmove可能会重叠。
char a[16];
char b[16];
memcpy(a,b,16); // valid
memmove(a,b,16); // Also valid, but slower than memcpy.
memcpy(&a[0], &a[1],10); // Not valid since it overlaps.
memmove(&a[0], &a[1],10); // valid.
memcpy的某些实现可能仍适用于重叠的输入,但是您不能指望这种行为。虽然记忆必须允许重叠。
- 3 回答
- 0 关注
- 604 浏览
添加回答
举报