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*(需强制类型转换)。
- 两者都返回
三、使用场景(何时用哪个)

四、安全风险(重点注意)
-
strcpy 易导致缓冲区溢出 :因为不检查
dest缓冲区长度,若src长度超过dest,会覆盖内存中其他数据,引发程序崩溃、安全漏洞(黑客常利用此漏洞攻击)。✅ 替代方案:用strncpy(dest, src, sizeof(dest)),指定最大拷贝长度。 -
memcpy 需确保 n 不越界 :若
n超过dest缓冲区大小或src的实际长度,同样会溢出,需手动保证n的正确性(通常用sizeof计算)。

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