C 语言 memcpy()

2025年3月17日 | 阅读 7 分钟

memcpy() 函数也称为复制内存块函数。它用于复制指定范围的字符。如果两个内存块有任何重叠,则该函数只能将对象从一个内存块复制到另一个内存块。

语法

C 语言中 memcpy() 函数的语法如下:

memcpy() 函数将从源数组或源位置复制 n 个指定的字符。在本例中,它是 arr1 到目标位置 arr2。arr1 和 arr2 都是指向源和目标位置的指针,分别表示。

memcpy() 中传递的参数

  • arr1:它是函数中的第一个参数,指定源内存块的位置。它表示将被复制到目标位置的数组。
  • arr2:函数中的第二个参数指定目标内存块的位置。它表示将复制内存块的数组。
  • n:它指定从源复制到目标的字符数。

返回

它返回一个指向 arr1 的指针。

头文件

由于 memcpy() 函数定义在 string.h 头文件中,因此在代码中包含它来实现该函数是必不可少的。

让我们看看如何在 C 程序中实现 memcpy() 函数。

注意:必须将复制数组中的最后一个索引设置为 null,因为该函数仅复制数据而不初始化内存本身。字符串需要一个 null 值来终止字符串。

在 C 编程中实现 memcpy() 之前需要考虑的重要事实

  • memcpy() 函数在 string.h 头文件中声明。因此,程序员需要确保在代码中包含该文件。
  • 要将内容复制到的缓冲区大小必须大于要复制到缓冲区中的字节数。
  • 当对象重叠时,它不起作用。如果我们尝试对重叠的对象执行函数,行为将是未定义的。
  • 在使用字符串时,必须添加一个 null 字符,因为它不检查字符串中的终止 null 字符。
  • 如果函数访问超出其大小的缓冲区,则函数行为将是未定义的。最好使用 sizeof() 函数检查缓冲区大小。
  • 它不确保目标内存块在系统内存中是有效的。

输出

memcpy() in C

由于新指针未指向任何有效位置,因此代码的行为是未定义的。因此,程序将无法正常运行。在某些编译器中,它也可能返回错误。以上情况下的目标指针是无效的。

  • memcpy() 函数也不执行源缓冲区的验证。

输出

memcpy() in C

在这种情况下,输出与上述情况类似,其中未指定目标。这里唯一的区别是它不会返回任何编译错误。它只会显示未定义的行为,因为源指针未指向任何已定义的位置。

  • memcpy() 函数对数据进行字节级操作。因此,为了获得所需的结果,n 的值应始终以字节为单位。
  • 在 memcpy() 函数的语法中,源和目标内存块的指针都声明为 void *,这意味着它们可用于指向任何类型的数据。

让我们看一些实现不同数据类型数据的 memcpy() 函数的示例。

使用 char 类型数据实现 memcpy() 函数

输出

memcpy() in C

在这里,我们初始化了两个大小为 30 的数组。sourcearr[] 包含要复制到 destarr 的数据。我们使用 memcpy() 函数将数据存储在 destarr[] 中。

实现 memcpy() 函数使用 integer 类型数据

输出

memcpy() in C

在此代码中,我们将整数存储在数组中。两个数组都可以存储 int 数据类型。我们使用索引在将 sourcearr 的元素复制到 destarr 后打印 destarr 的元素。

使用 struct 数据类型实现 memcpy() 函数

输出

memcpy() in C

在上面的代码中,我们定义了结构。我们使用了两次 memcpy() 函数。第一次用于将字符串复制到 prsn1,第二次用于将数据从 prsn1 复制到 prsn2。

在 C 编程语言中定义你自己的 memcpy() 函数

在 C 编程语言中实现 memcpy() 函数相对容易。memcpy() 函数背后的逻辑非常简单。要实现 memcpy() 函数,您必须将源地址和目标地址强制转换为 char*(1 字节)。执行类型转换后,现在将内容从源数组复制到目标地址。我们必须逐字节共享数据。重复此步骤,直到完成 n 个单位,其中 n 是指定要复制的数据的字节数。

让我们编写自己的 memcpy() 函数

注意:下面的函数与实际的 memcpy() 函数工作方式类似,但此用户定义函数尚未处理许多情况。使用你自己的 memcpy() 函数,你可以决定要包含在函数中的特定条件。但如果没有指定条件,首选使用库函数中定义的 memcpy() 函数。

让我们编写一个驱动程序代码来检查上述代码是否正常工作。

用于测试 MemCpy() 函数的驱动程序代码

在下面的代码中,我们将使用 arr1 通过 MemCpy() 函数将数据复制到 arr2。

输出

memcpy() in C