C语言中memcpy 的使用示例详解

 更新时间:2025年09月15日 17:02:10   作者:yuyousheng_  
memcpy是C语言中非常重要的一个函数,用于内存块的复制,它定义在标准头文件 <string.h> 中,这篇文章给大家介绍C语言 memcpy的使用,感兴趣的朋友跟随小编一起看看吧

memcpy是C语言标准库中用于内存复制的核心函数,能够高效地将指定字节数的数据从源地址复制到目标地址。它在处理非重叠内存区域的批量数据拷贝时表现出色,广泛应用于结构体复制、数组拷贝等场景。本文将从函数原型、使用场景、注意事项等方面展开分析,并结合实际代码示例说明其正确用法。

memcpy 是 C 语言中非常重要的一个函数,用于内存块的复制。它定义在标准头文件 <string.h> 中。

📌 函数原型

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

参数说明:

参数类型含义
destvoid *目标内存地址(要复制到哪里)
srcconst void *源内存地址(从哪里复制)
nsize_t要复制的字节数

返回值:

  • 返回指向目标内存 dest 的指针(即第一个参数)。
  • 通常可以忽略返回值,但在链式调用或需要检查时有用。

✅ 使用步骤与要点

  • 包含头文件
  • #include <string.h>
    
  • 确保目标空间足够大
    • dest 必须有足够的内存空间容纳 n 个字节,否则会导致缓冲区溢出和未定义行为。
  • 避免内存重叠
    • 如果源和目标内存区域有重叠,使用 memcpy 会导致未定义行为
    • 此时应使用 memmove,它是安全处理重叠内存的版本。

💡 示例代码

示例 1:基本用法 —— 复制数组

#include <stdio.h>
#include <string.h>
int main() {
    int src[] = {10, 20, 30, 40, 50};
    int dest[5];
    // 复制 5 个整数(每个 int 通常是 4 字节,共 20 字节)
    memcpy(dest, src, sizeof(src));
    for (int i = 0; i < 5; i++) {
        printf("%d ", dest[i]);  // 输出: 10 20 30 40 50
    }
    return 0;
}

示例 2:复制结构体

#include <stdio.h>
#include <string.h>
typedef struct {
    int id;
    char name[20];
    float score;
} Student;
int main() {
    Student s1 = {1001, "Alice", 95.5f};
    Student s2;
    memcpy(&s2, &s1, sizeof(Student));
    printf("ID: %d, Name: %s, Score: %.1f\n", 
           s2.id, s2.name, s2.score);
    // 输出: ID: 1001, Name: Alice, Score: 95.5
    return 0;
}

示例 3:复制字符串(非最佳实践)

#include <stdio.h>
#include <string.h>
int main() {
    char src[] = "Hello, world!";
    char dest[50];
    memcpy(dest, src, strlen(src) + 1);  // +1 包含 '\0'
    printf("Copied string: %s\n", dest);
    return 0;
}

⚠️ 注意:对于字符串,推荐使用 strcpy 或更安全的 strncpy / strlcpy / snprintf

⚠️ 常见错误与陷阱

错误说明
❌ 目标空间不足char dest[10]; memcpy(dest, src, 100); → 写越界,崩溃或安全漏洞
❌ 源指针为空memcpy(dest, NULL, n) → 崩溃
❌ 目标指针为空memcpy(NULL, src, n) → 崩溃
❌ 内存重叠memcpy(buf+1, buf, 10); → 未定义行为!应改用 memmove

✅ 正确做法示例(使用 memmove 处理重叠):

char buf[] = "abcdef";
memmove(buf + 1, buf, 5);  // 将 "abcde" 左移一位
// 结果: "aabcde"

🔍memcpyvsmemmove

函数是否支持内存重叠性能推荐场景
memcpy❌ 不保证更快确定无重叠时使用
memmove✅ 安全支持稍慢可能存在重叠时使用

建议:如果不确定是否重叠,优先使用 memmove

🛠️ 技巧:复制部分数据

double data[100];
double subset[10];
// 只复制前 10 个 double
memcpy(subset, data, 10 * sizeof(double));

✅ 安全使用建议

  1. 使用 sizeof() 计算大小,避免硬编码。
  2. 确保目标缓冲区已分配且足够大。
  3. 对于字符串操作,考虑使用更高层函数(如 strcpy, strncpy)。
  4. 避免跨线程共享未保护的内存拷贝。
  5. 在嵌入式或性能敏感场景中,memcpy 是高效选择。

🧪 小结:一句话记住memcpy

“按字节复制一块内存,不管内容是什么。”

它不关心你复制的是 intfloat、结构体还是字符串 —— 它只是把一串字节从一个地方搬到另一个地方。

如果你是在实现序列化、解析协议、操作二进制数据等底层任务,memcpy 是不可或缺的工具。但务必小心使用,防止内存错误!

到此这篇关于C语言中memcpy 的使用示例详解的文章就介绍到这了,更多相关C语言 memcpy使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现WebSocket服务器的案例分享

    C++实现WebSocket服务器的案例分享

    WebSocket是一种在单个TCP连接上进行全双工通信的通信协议,与HTTP协议不同,它允许服务器主动向客户端发送数据,而不需要客户端明确地请求,本文主要给大家介绍了C++实现WebSocket服务器的案例,需要的朋友可以参考下
    2024-05-05
  • C++开发之CRC校验实例详解

    C++开发之CRC校验实例详解

    这篇文章主要介绍了C++开发之CRC校验实例详解的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++中Digraphs、Trigraphs和Tokens的深入讲解

    C++中Digraphs、Trigraphs和Tokens的深入讲解

    这篇文章主要给大家介绍了关于C++中Digraphs、Trigraphs和Tokens的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • 关于C++地址交换的实现

    关于C++地址交换的实现

    在C++中,地址交换通常是指通过指针操作改变两个变量之间的内存地址引用,当你有两个指针分别指向两个变量时,你可以通过某种机制交换这两个指针的内容,使得它们各自指向对方原来的位置,本介绍了关于C++地址交换的实现,需要的朋友可以参考下
    2024-11-11
  • 一文详解C++11中的lambda函数

    一文详解C++11中的lambda函数

    小编可以明确告诉大家:lambda函数是C++11中最重要的,使用最广泛的,最具现代风格的内容,lambda函数的出现改变了C++编程的思维方式。所以快和小编学习一下C++11中lambda函数的使用吧
    2023-02-02
  • C语言学生成绩管理系统源代码

    C语言学生成绩管理系统源代码

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • c++ 深入理解归并排序的用法

    c++ 深入理解归并排序的用法

    归并排序是典型分治思想的代表——首先把原问题分解为两个或多个子问题,然后求解子问题的解,最后使用子问题的解来构造出原问题的解
    2022-03-03
  • Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围

    Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围

    在日常开发过程中QLineEdit作为输入框,有时要限制输入的内容,这篇文章主要给大家介绍了关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • Qt控件之QPushButton使用及技巧

    Qt控件之QPushButton使用及技巧

    QPushButton类是Qt中用于创建按钮的控件类,它继承自QAbstractButton类,本文就来介绍一下Qt控件之QPushButton使用及技巧,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C语言代码实现2048游戏

    C语言代码实现2048游戏

    这篇文章主要为大家详细介绍了C语言代码实现2048游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论