可能重复:
memcpy vs memmove
memmove是否真的“移动”了一块内存?如果是这样,它会留下零吗?或者,它就像memcpy吗?我正在查看手册页,但我不相信我的假设是正确的。如果我想使用 memmove 移动一块内存,我是否必须手动将我移动的那块内存清零?
memmove
与清除旧内存无关,实际上只有在您想要使用的情况下memmove
,清除旧内存会破坏您刚刚复制的数据!这是因为memmove
仅当您期望源和目标范围重叠时才有用。
通常,如果您发现自己需要memmove
,则表明您的设计存在严重的基本效率低下。例如,新的 C 程序员通常会尝试使用memmove
来删除字符串的前几个字符(例如memmove(s, &s[1], len)
),而不仅仅是使用s+1
或&s[1]
处理字符串的尾部。包含memmove
很少比 O(n^2) 更好的算法。
不完全的:
和之间的主要区别在于memmove
,memcpy
它memmove
可用于将一块内存重新定位到与您尝试移动的内存块重叠的某个位置。因此原始指针将不再有效。
memcpy
另一方面,两个区域不能重叠。
memmove
虽然不会将原始内存块归零。如果你想这样做,你必须自己明确地使用memset来做。作为一项规则,C 例程不会将周期浪费在做一些不必要的事情上,例如将内存归零。与 比较malloc
,同样不会将内存块归零。