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

cpy相关函数区分

函数安全机制(防溢出)自动补 \0处理非字符串适用场景关键差异
strcpy无(不限制长度)已知长度的字符串复制无长度限制,易溢出
strncpy有(限制 n 字符)否(可能)需控制长度,需手动补 \0超长时不补 \0,可能填充空字符
strlcpy有(限制 size 字节)安全字符串复制(推荐)返回 src 总长度,可判断截断
memcpy有(限制 n 字节)二进制数据(结构体、数组)按字节复制,不处理字符串逻辑
函数调用dest 结果(内存内容)说明
strcpy(dest, src)h e l l o w(无 \0溢出,无 \0,不安全
strncpy(dest, src, 5)h e l l o(无 \0复制 5 字符,不补 \0,需手动处理
strlcpy(dest, src, 6)h e l l o \0复制 5 字符 + \0,返回 11(src 长度)
memcpy(dest, src, 5)h e l l o(无 \0仅复制 5 字节,不处理字符串逻辑

1. strcpy:最基础但不安全的复制

  • 函数原型
    char *strcpy(char *dest, const char *src);
    
  • 功能:将 src 指向的字符串(包含 \0)完整复制到 dest,直到遇到 src 的 \0 为止。
  • 特点
    • 不检查 dest 缓冲区大小,若 src 长度超过 dest 容量,会导致缓冲区溢出(覆盖其他内存)。
    • 自动复制 src 的结束符 \0 到 dest
  • 适用场景:仅在确定 src 长度小于 dest 时使用(如常量字符串复制)。

2. strncpy:有限制的复制(部分安全)

  • 函数原型
    char *strncpy(char *dest, const char *src, size_t n);
    
  • 功能:最多复制 n 个字符从 src 到 dest
  • 特点
    • 限制复制长度为 n,避免缓冲区溢出(相比 strcpy 更安全)。
    • 关键缺陷
      • 若 src 长度 >= n,则不会在 dest 末尾添加 \0(可能导致 dest 不是合法字符串)。
      • 若 src 长度 < n,会用 \0 填充剩余空间(直到凑满 n 个字符,可能浪费空间)。

3. strlcpy:更安全的复制(非标准但推荐)

  • 函数原型(POSIX 扩展,部分系统支持):
    size_t strlcpy(char *dest, const char *src, size_t size);
    
  • 功能:复制 src 到 dest,确保 dest 以 \0 结尾,且总长度不超过 size-1
  • 特点
    • 安全性高:自动在 dest 末尾添加 \0(即使 src 超长,也会截断并补 \0)。
    • 返回值:src 的总字节长度(方便判断是否被截断)。
    • 不填充多余 \0(相比 strncpy 更高效)。

4. memcpy:二进制数据复制(不限于字符串)

  • 函数原型
    void *memcpy(void *dest, const void *src, size_t n);
    

  • 功能:从 src 复制 n 个字节到 dest(按二进制复制,不关心 \0)。
  • 特点
    • 适用于任何数据(字符串、数组、结构体等),不仅限于字符串。
    • 不处理 \0(即使复制字符串,也需手动确保 \0 被包含)。
    • 若 src 和 dest 内存重叠,可能导致未定义行为(此时应使用 memmove)。
http://www.lryc.cn/news/608987.html

相关文章:

  • Ollama模型库模型下载慢完美解决(全平台)
  • 设计模式 - 组合模式:用树形结构处理对象之间的复杂关系
  • 新手向:Python制作贪吃蛇游戏(Pygame)
  • FLUX.1 Krea - 告别“AI味”,感受超自然细节,黑森林最新开源文生图模型 支持50系显卡 一键整合包下载
  • 控制建模matlab练习08:根轨迹
  • js--2048小游戏
  • 【openlayers框架学习】十:openlayers中控件的使用
  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • C语言与数据结构:从基础到实战
  • 解决飞书文档中PDF文档禁止下载的问题
  • Linux 环境下 Docker 安装与简单使用指南
  • ubuntu syslog中appindicator报错解决
  • 扩散模型(一)——综述
  • Rust: 获取 MAC 地址方法大全
  • 【MySQL进阶】------MySQL程序
  • 机器学习第三课之逻辑回归(三)LogisticRegression
  • 2025H1具身智能产业十大数据
  • Python训练营打卡 Day27
  • 【网络安全】日志文件格式
  • Linux 系统调用 stat 完全用例
  • Web前端文件上传安全与敏感数据安全处理
  • HiveMQ核心架构思维导图2024.9(Community Edition)
  • 反向代理+网关部署架构
  • 动态置信度调优实战:YOLOv11多目标追踪精度跃迁方案(附完整代码)
  • 关于corn
  • Android 之 图片加载(Fresco/Picasso/Glide)
  • 禁闭求生2 免安 中文 离线运行版
  • 【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)
  • 【LeetCode 热题 100】84. 柱状图中最大的矩形——(解法一)单调栈+三次遍历
  • 二叉树的锯齿形层次遍历