一文看懂内存拷贝神器:memcpy() 函数详解】

张开发
2026/5/31 11:37:45 15 分钟阅读
一文看懂内存拷贝神器:memcpy() 函数详解】
在 C 语言的编程世界里我们经常需要和内存打交道。如果你需要把一块内存里的数据“原封不动”地搬运到另一块内存中那么标准库提供的memcpy函数绝对是你的得力助手。今天我们就来掰开揉碎地讲讲这个函数看看它怎么用以及有哪些需要避开的坑。1. 认识 memcpy它是做什么的memcpy的全称是memory copy内存拷贝。它的核心功能非常简单直接从源内存地址的起始位置开始拷贝n个字节的数据到目标内存地址中。不管你内存里存的是字符串、整型数组还是复杂的结构体在memcpy眼里它们都只是一串毫无感情的二进制字节流。它只负责搬运绝不夹带私货。2. 函数原型与参数解析要使用memcpy首先需要引入头文件#include string.h它的函数原型长这样void *memcpy(void *dest, const void *src, size_t n);我们来逐一拆解这些参数dest(Destination)目标指针。指向你想要把数据存放进去的那块内存。src(Source)源指针。指向你想要读取数据的哪块内存。注意前面有个const说明它不会修改源数据。n你要拷贝的字节数注意是字节数不是元素个数这是新手常犯的错误。返回值函数会返回一个指向目标内存区域dest的指针。3. 代码实战memcpy 怎么用光说不练假把式我们来看看实际代码中怎么用。场景一拷贝字符串虽然拷贝字符串通常用strcpy但memcpy同样可以胜任只要你指定好长度即可。#include stdio.h #include string.h int main() { const char src[50] Hello, C Programming!; char dest[50]; // 把 src 中的字符串包含末尾的 \0拷贝到 dest 中 // 1 是为了把隐藏的字符串结束符 \0 也拷过去 memcpy(dest, src, strlen(src) 1); printf(目标字符串 dest %s\n, dest); return 0; }场景二拷贝整型数组重点这是memcpy最大显身手的地方。当你需要复制一个非字符数组时strcpy就无能为力了。#include stdio.h #include string.h int main() { int src_array[] {10, 20, 30, 40, 50}; int dest_array[5]; // 注意第三个参数必须是 (元素个数 * 单个元素所占的字节数) memcpy(dest_array, src_array, 5 * sizeof(int)); printf(拷贝后的 dest_array: ); for(int i 0; i 5; i) { printf(%d , dest_array[i]); } printf(\n); return 0; }4. 避坑指南致命的“内存重叠”memcpy虽然高效但它是个“愣头青”——它在拷贝时不会检查源内存和目标内存是否发生重叠Overlap。什么是内存重叠假设你有一个数组你想把前 5 个元素拷贝到从第 3 个元素开始的位置上。这时候源区域和目标区域就重叠了。如果你在这种情况下使用memcpy它的行为是未定义的Undefined Behavior。可能会导致数据在被读取前就被覆盖拷出一堆乱码。终极建议如果你明确知道源内存和目标内存绝不可能重叠放心大胆地使用memcpy它的效率非常高。如果你怀疑两块内存有可能重叠请乖乖换成它的兄弟函数memmove()。memmove会在拷贝前处理好重叠问题保证数据安全代价是稍微牺牲一点点性能。总结memcpy用于拷贝任意类型的数据。按**字节byte**进行拷贝计算长度时别忘了乘上sizeof(数据类型)。需要包含string.h。严禁用于有内存重叠的场景重叠场景请找memmove。C 库函数 – memcpy() | 菜鸟教程

更多文章