为了账号安全,请及时绑定邮箱和手机立即绑定

memcpy()vs memmove()

memcpy()vs memmove()

C
慕盖茨4494581 2019-10-05 14:32:01
我想了解的区别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执行测试以确定循环方向,以免破坏数据。这些实现非常简单。大多数高性能的实现更为复杂(涉及一次复制字大小的块而不是字节)。


查看完整回答
反对 回复 2019-10-05
?
慕的地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的某些实现可能仍适用于重叠的输入,但是您不能指望这种行为。虽然记忆必须允许重叠。


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 597 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信