C语言 strcpy和memcpy 异同/区别

memcpy 和 strcpy 是 C 语言中用于内存 / 字符串拷贝的核心函数,二者设计目标、拷贝规则、适用场景差异显著,下面从核心定义、关键区别、使用场景、安全风险 四个维度详细对比:

一、核心定义(基础知识)

二、关键区别(核心差异)

1. 拷贝终止条件(最核心)
  • strcpy :以 \0 为终止符 ,会从 src 开始逐字节拷贝,直到遇到 \0(包括 \0 也会拷贝到 dest),不检查目标缓冲区长度 。
    • 例:src = "abc"(实际内存是 a b c \0),strcpy 会拷贝 a、b、c、\0 共 4 个字节。
  • memcpy :以指定长度 n 为终止条件 ,不管内存中是否有 \0,都会严格拷贝 n 个字节,是 "无脑" 的内存块拷贝。
    • 例:memcpy(dest, src, 3) 只会拷贝 3 个字节,哪怕 src 中间有 \0 或末尾无 \0。
2. 处理的数据类型
  • strcpy :仅适用于字符串 (char 类型),因为依赖 \0 识别结束,拷贝非字符串(如结构体、数组)会出错。
  • memcpy :通用型内存拷贝 ,支持任意数据类型(int、结构体、数组、二进制数据等),因为参数是 void*(无类型指针),可接收任意类型的内存地址。
    • 例:拷贝结构体 / 数组: c运行

      复制代码
      // 用memcpy拷贝int数组(strcpy无法实现)
      int arr1[] = {1,2,3}, arr2[3];
      memcpy(arr2, arr1, sizeof(arr1)); // 拷贝整个数组
3. 源内存重叠处理
  • strcpy :不处理内存重叠 ,若 src 和 dest 内存重叠(如 dest 指向 src+1),结果未定义(可能拷贝出错)。
  • memcpy :标准未要求处理重叠,但大部分编译器(如 GCC)的实现也不处理重叠 ;若需处理重叠,需用 memmove(memmove 是 memcpy 的安全升级版)。
    • 注意:strncpy(strcpy 的长度限制版)也不处理重叠。
4. 参数与返回值
  • 参数:
    • strcpy 参数限定为 char*,只能操作字符串;
    • memcpy 参数为 void*,需手动指定拷贝长度 n(通常用 sizeof 计算)。
  • 返回值:
    • 两者都返回 dest 的起始地址(方便链式调用),但 strcpy 返回 char*,memcpy 返回 void*(需强制类型转换)。

三、使用场景(何时用哪个)

四、安全风险(重点注意)

  1. strcpy 易导致缓冲区溢出 :因为不检查 dest 缓冲区长度,若 src 长度超过 dest,会覆盖内存中其他数据,引发程序崩溃、安全漏洞(黑客常利用此漏洞攻击)。✅ 替代方案:用 strncpy(dest, src, sizeof(dest)),指定最大拷贝长度。

  2. memcpy 需确保 n 不越界 :若 n 超过 dest 缓冲区大小或 src 的实际长度,同样会溢出,需手动保证 n 的正确性(通常用 sizeof 计算)。

strcpy 是 "字符串专属拷贝",靠 \0 收尾;memcpy 是 "万能内存拷贝",靠长度说话

相关推荐
starzy19901 分钟前
Scala Array操作:从定长数组到ArrayBuffer的完整指南
开发语言·后端·scala
读书札记202214 分钟前
Qt UTF-8和UTF-8(BOM)
开发语言·qt
ShineWinsu16 分钟前
对于Qt:QProgressBar常见属性的解析
开发语言·c++·qt·进度条·gui·定时器·qprogressbar
fanruitian18 分钟前
python 机器学习 交叉验证train_test_split 网格搜索GridSearchCV
开发语言·python·机器学习
AlanAshley25 分钟前
无 SIM 卡也能打 110?手机紧急呼叫能力的软硬件技术探究
开发语言·智能手机·php
modelmd30 分钟前
Go 切片、映射常见使用场景
开发语言·后端·golang
dialect_9 小时前
KMP算法
开发语言·c++·算法
总要学点什么10 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
开开心心_Every11 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
chenbingjie_c11 小时前
C++ 多态完全指南:从虚函数重写到虚函数表原理
开发语言·c++