memcpy 和 memmove 有什么区别?

这两个副本函数都用于将 n 个字符从源对象复制到目标对象,但它们有一些区别,如下所述。

  • 如果源指针和目标指针指向的内存区域重叠,则 memcpy 复制函数会显示未定义的行为。 memmove 函数在重叠的情况下具有定义的行为。 因此,每当有疑问时,使用 memmove 代替 memcpy 会更安全。

    #include <string.h>
    #include <stdio.h>
    char str1[50] = I am going from Delhi to Gorakhpur;
    char str2[50] = I am going from Gorakhpur to Delhi;
    int main( void )
    {
      //Use of memmove
      printf( Function:\tmemmove with overlap\n );
      printf( Orignal :\t%s\n,str1);
      printf( Source:\t\t%s\n, str1 + 5 );
      printf( Destination:\t%s\n, str1 + 11 );
      memmove( str1 + 11, str1 + 5, 29 );
      printf( Result:\t\t%s\n, str1 );
      printf( Length:\t\t%d characters\n, strlen( str1 ) );
      //Use of memcpy
      printf( Function:\tmemcpy with overlap\n );
      printf( Orignal :\t%s\n,str2);
      printf( Source:\t\t%s\n, str2 + 5 );
      printf( Destination:\t%s\n, str2 + 11 );
      memcpy( str2 + 11, str2 + 5, 29 );
      printf( Result:\t\t%s\n, str2 );
      printf( Length:\t\t%d characters\n, strlen( str2 ) );
      return 0;
    }

    运行结果:

    Function: memmove with overlap
    Orignal : I am going from Delhi to Gorakhpur
    Source: going from Delhi to Gorakhpur
    Destination: from Delhi to Gorakhpur
    Result: I am going going from Delhi to Gorakhpur
    Length: 40 characters
    Function: memcpy with overlap
    Orignal : I am going from Gorakhpur to Delhi
    Source: going from Gorakhpur to Delhi
    Destination: from Gorakhpur to Delhi
    Result: I am going going fring frakg frako frako
    Length: 40 characters
  • 与 memcpy 相比,memmove 函数较慢,因为在 memmove 中,额外的临时数组用于从源复制 n 个字符,然后将存储的字符复制到目标内存。

  • memcpy 在转发副本时很有用,但 memmove 在重叠场景的情况下很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


在C语言中声明变量:变量声明仅在编译时向编译器提供以给定类型和名称存在的变量的确定性,以便编译器继续进行进一步编译,而不需要该变量的所有细节。 在 C 语言中,当我们声明一个变量时,我们只将信息提供给
全局变量和静态全局变量有不同的联系。 这就是全局变量可以在文件外部访问但静态全局变量只能在声明它的文件内访问的原因。
存储类决定程序中变量或函数的范围(生命周期)和范围(可见性)。 每个变量都在内存中的某个位置以位的形式存储变量的值。 存储类决定这些变量值将存储在 CPU 寄存器、堆栈内存、BSS 或 DS 中的位置。
在C语言中,外部静态变量有内部链接,内部静态变量没有链接。 这就是它们具有不同范围但两者都将在整个程序中存活的原因。
让我们先来看一下 typedef 和宏的简短描述,以了解它们之间的区别。 typedef C语言提供了一个非常重要的关键字 typedef,用于为现有类型定义新名称。 typedef 是编译器指令,主要与用户定义的数据类型(结构、联
编译器错误。 解释:typedef 已被视为部分存储类,因此不能一次混合两个存储类。
C语言中的变量定义了一个位置名称,可以在其中放置值,并且可以在程序中需要时使用这些值。 换句话说,可以说变量是一个名称(或标识符),它指示内存中的某个物理地址,其中数据以字符串位的形式存储。
变量 p 对应的声明如下: 1. int p; // An integer 2. int p[5]; // An array of 5 integers 3. int *p; // A pointer to an integer
数据类型是数据的分类,它告诉编译器或解释器程序员打算如何使用数据。 换句话说,您可以说它定义了变量的大小(BYTE)和范围。C语言中数据类型的分类:1、预定义数据类型(int、char、float等)2、用户定义的数据类
在 C 语言中,static 关键字非常重要。 如果在变量或函数中使用了 static 关键字,那么只有内部链接或无链接有效。1、静态变量只初始化一次,因此在函数体内声明为静态的变量在函数调用之间保持其先前值。2、带
C语言有3种链接,外部链接、内部链接和无链接。
可以,我们可以在头文件中声明静态变量。
C标准解释了整数的最小大小应该是 16 位。 一些编程语言解释说整数的大小取决于实现,但可移植程序不应该依赖它。整数的大小主要取决于编译器编写者为底层处理器编写的编译器类型。可以看到编译器根据便利性和底
在标准 C 语言中,整数数据类型默认是有符号的。 所以如果创建一个整数变量,它可以存储正值和负值。
有符号和无符号整数类型具有相同的存储(根据标准至少 16 位)和对齐方式,但它们仍然存在很多差异,在下面的行中,描述有符号和无符号整数之间的一些差异。
宏和函数的区别如下所示:
输出:编译器错误。说明: 扩展宏时,var 将被替换为 0(Rvalue)。 因为正在尝试增加 Rvalue,所以将收到编译器错误。
C语言中的枚举是用户定义的数据类型。 它由一组命名的常量整数组成。 使用 enum 关键字,我们可以通过使用枚举标签(可选)和命名整数列表来声明枚举类型。基本上,我们使用枚举来增加代码的可读性,并且与符号常
const 限定符仅向编译器指示无法更改限定对象的值。 简单来说, const 表示不可修改(不能在运行时给对象赋值)。
在程序中有以下地方需要使用 const 关键字: 在引用函数参数调用中,如果不想更改已传入函数的实际值。