我想了解的区别memcpy()和memmove(),和我读的文本memcpy(),而没有照顾重叠源和目的地memmove()一样。但是,当我在重叠的存储块上执行这两个功能时,它们都给出相同的结果。例如,在memmove()帮助页面上采用以下MSDN示例:-有没有更好的例子来了解它的缺点memcpy以及如何memmove解决?// crt_memcpy.c// Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle// it correctly.#include <memory.h>#include <string.h>#include <stdio.h>char str1[7] = "aabbcc";int main( void ){ printf( "The string: %s\n", str1 ); memcpy( str1 + 2, str1, 4 ); printf( "New string: %s\n", str1 ); strcpy_s( str1, sizeof(str1), "aabbcc" ); // reset string printf( "The string: %s\n", str1 ); memmove( str1 + 2, str1, 4 ); printf( "New string: %s\n", str1 );}输出:The string: aabbccNew string: aaaabbThe string: aabbccNew string: aaaabb
3 回答
MMMHUHU
TA贡献1834条经验 获得超8个赞
对于您的示例没有任何奇怪的行为,我并不感到完全惊讶。尝试复制str1到str1+2,然后看看会发生什么。(实际上可能没有什么不同,取决于编译器/库。)
通常,memcpy以简单(但快速)的方式实现。简单地说,它只是按顺序循环数据,从一个位置复制到另一个位置。这可能会导致在读取源时将其覆盖。
Memmove会做更多的工作来确保正确处理重叠。
编辑:
(不幸的是,我找不到合适的例子,但是这些都可以)。对比此处显示的memcpy和memmove实现。memcpy只是循环,而memmove执行测试以确定循环方向,以免破坏数据。这些实现非常简单。大多数高性能的实现更为复杂(涉及一次复制字大小的块而不是字节)。
慕的地8271018
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 关注
- 597 浏览
添加回答
举报
0/150
提交
取消