当前位置: 首页 > news >正文

memcpy 使用指南 (C语言)

memcpy 是 C 语言标准库中的一个重要函数,用于在内存区域之间复制数据。它是 <string.h> 头文件中定义的高效内存操作函数之一。

函数原型

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

参数说明

  • dest: 目标内存地址,数据将被复制到这里

  • src: 源内存地址,数据从这里复制

  • n: 要复制的字节数

返回值

返回目标内存地址 dest 的指针。

基本用法

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[20];// 复制 src 的内容到 destmemcpy(dest, src, strlen(src) + 1); // +1 是为了包含字符串结束符 '\0'printf("源字符串: %s\n", src);printf("目标字符串: %s\n", dest);return 0;
}

重要注意事项

  1. 内存重叠问题:

    • memcpy 不处理内存重叠的情况。如果源和目标内存区域重叠,行为是未定义的。

    • 对于重叠内存区域,应该使用 memmove 函数。

  2. 边界检查:

    • 必须确保目标缓冲区足够大,以避免缓冲区溢出。

  3. 类型无关:

    • memcpy 可以用于任何数据类型,因为它按字节操作。

结构体复制示例

#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s1 = {1, "Alice", 95.5};Student s2;// 复制结构体memcpy(&s2, &s1, sizeof(Student));printf("学生ID: %d\n", s2.id);printf("学生姓名: %s\n", s2.name);printf("学生成绩: %.1f\n", s2.score);return 0;
}

性能考虑

memcpy 通常经过高度优化,比手动编写的循环复制要快得多,特别是对于大块数据。

与 strcpy 的区别

  • strcpy 用于以 null 结尾的字符串,遇到 '\0' 停止复制

  • memcpy 严格按指定的字节数复制,不考虑任何终止符

安全替代品

在一些安全敏感的编程环境中,可以考虑使用更安全的版本:

  • memcpy_s (C11 标准)

  • 或者自己实现带有边界检查的版本

相关文章:

  • Node.js API 安全的主要策略:最佳实践
  • 来自B站AIGC科技官的“vLLM简介“视频截图
  • FPGA时钟设计
  • XMOS直播声卡——可支持实时音频DSP处理的低延迟音频方案
  • 音频转base64
  • SQL面试之--明明建了索引为什么失效了?
  • C语言复习笔记--内存函数
  • 《代码整洁之道》第10章 类 - 笔记
  • 跨境电商货物体积与泡重计算器:高效便捷的物流计算工具
  • Zookeeper实现分布式锁实战应用
  • 【Office-Excel】单元格输入数据后自动填充单位
  • 增强版wps-plugin-deepseek开源插件是DeepSeek 支持的 WPS 插件,在您的办公工作流程中提供智能文档自动化和 AI 驱动的生产力增强
  • 【计算机哲学故事1-2】输入输出(I/O):你吸收什么,便成为什么
  • QT6 源(53)篇三:存储 c 语言字符串的类 QByteArray 的使用举例,
  • NodeJs模块化与JavaScript的包管理工具
  • 前端开发资源缓存策略
  • 蓝桥杯 9.生命之树
  • 深入理解 JavaScript 的 typeof 运算符:返回的数据类型
  • 2024ICPC网络赛第二场题解
  • 个人介绍网站设计
  • 全球前瞻|王毅赴巴西出席金砖外长会,加拿大迎来“几十年来最重要大选”
  • 伊朗爆炸港口已恢复货物进出口工作
  • 没有雷军的车展:老外扎堆,萌车、机器狗谁更抢镜?| 湃客Talk
  • 摩根士丹利基金雷志勇:AI带来的产业演进仍在继续,看好三大景气领域
  • 来论|这无非就是一只“纸老虎”:评特朗普政府“关税战”
  • 破解160年基因谜题,我国科学家补上豌豆遗传研究最后拼图