跳到主要内容

C++ memcpy() 函数

C++ 中的 memcpy() 函数用于从源位置复制指定字节的数据到目标位置。它定义在 cstring 头文件中。

示例

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char source[] = "Tutorial";
char destination[] = "Programiz";

// 将 source 的所有字节复制到 destination
memcpy(destination, source, sizeof(source));

cout << destination;

return 0;
}

// 输出: Tutorial

memcpy() 语法

memcpy() 函数的语法是:

memcpy(void* dest, const void* src, size_t count);

memcpy() 参数

memcpy() 函数接受以下参数:

  • dest - 指向复制内容目标内存位置的指针。其类型为 void*
  • src - 指向复制内容源内存位置的指针。其类型为 void*
  • count - 从 src 复制到 dest 的字节数。其类型为 size_t

注意: 由于 srcdest 的类型为 void*,我们可以使用多数数据类型与 memcpy() 一起使用。

memcpy() 返回值

memcpy() 函数返回:

  • dest - 目标内存位置

memcpy() 原型

cstring 头文件中定义的 memcpy() 的原型是:

void* memcpy(void* dest, const void* src,size_t count);

当我们调用这个函数时,它会从由 src 指向的内存位置复制 count 字节到由 dest 指向的内存位置。

memcpy() 未定义行为

如果出现以下情况,memcpy() 的行为是未定义的:

  • srcdest 是空指针,或者
  • 对象重叠。

示例 1:C++ memcpy()

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char source[] = "Tutorial";
char destination[] = "Programiz";

cout << "初始 destination: " << destination << endl;

// 将 destination 的所有字节复制到 source
memcpy(destination, source, sizeof(source));

cout << "最终 destination: " << destination;

return 0;
}
```**输出**

```cpp
初始目的地: Programiz
最终目的地: Tutorial

在这里,我们使用 sizeof() 函数将 source 的所有字节复制到了 destination

示例 2:C++ memcpy() - 只复制 source 的部分内容

#include <cstring>
#include <iostream>
using namespace std;

int main() {
char source[] = "Tutorial";
char destination[] = "Programiz";

cout << "初始目的地: " << destination << endl;

// 将 source 的前 4 个字节复制到 destination
memcpy(destination, source, 4);

cout << "最终目的地: " << destination;

return 0;
}

输出

初始目的地: Programiz
最终目的地: Tutoramiz

这里,我们只将 source 的前 4 个字节复制到了 destination

由于一个 char 数据占用 1 个字节,因此这个程序用 source 的前 4 个字符替换了 destination 的前 4 个字符。

示例 3:C++ memcpy() 用于整型

#include <cstring>
#include <iostream>
using namespace std;

int main() {
int source[10] = {8, 3, 11, 61, -22, 7, -6, 2, 13, 47};
int destination[5];

// 将 source 的前 5 个元素(20 个字节)复制到 destination
memcpy(destination, source, sizeof(int) * 5);

cout << "复制后" << endl;

for (int i = 0; i < 5; i++)
cout << destination[i] << endl;
return 0;
}

输出

复制后
8
3
11
61
-22

在这里,我们创建了两个 int 数组 source[]destination[],大小分别为 105

然后我们使用 memcpy() 函数将 source[] 的前 5 个元素复制到了 destination[]

memcpy(destination, source, sizeof(int) * 5);

注意参数 sizeof(int) * 5。代码 sizeof(int) 给出了单个 int 数据占用的总字节数,即 4 个字节。

由于我们想从 source[] 复制 5 个 int 元素到 destination[],我们将 sizeof(int) 乘以 5,即等于 20 个字节的数据。