【发布时间】:2011-05-23 21:19:09
【问题描述】:
我试图了解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: aabbcc
New string: aaaabb
The string: aabbcc
New string: aaaabb
【问题讨论】:
-
微软 CRT 有一个安全的 memcpy() 已经有一段时间了。
-
我不认为“安全”是正确的词。安全的
memcpy将assert区域不重叠,而不是故意掩盖代码中的错误。 -
取决于您的意思是“对开发人员安全”还是“对最终用户安全”。我会争辩说,即使不符合标准,按指示行事也是最终用户更安全的选择。
-
微软的“安全”memcpy() 是 memmove() 的后备twitter.com/MalwareMinigun/status/737801492808142848
-
可以在此处找到有关“
memcpy(...)可能出错的问题”主题的图片示例:memcpy vs memmove。