memmove真的“移动”了一大块内存并在源头留下了零吗?
可能重复:
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
, malloc
同样不会将内存块归零。