strcpy 与 memcpy 的区别。考点字符串复制与内存复制之间的区别。出现频率★★★★解析strcpy 和 memcpy 主要有以下 3 方面的区别。- 复制的内容不同。strcpy 只能复制字符串而 memcpy 可以复制任意内容字符数组、整型、结构体、类等。- 复制的方法不同。strcpy 不需要指定长度它遇到字符串结束符 \0 便结束memcpy 则是根据其第3个参数决定复制的长度。- 用途不同。通常在复制字符串时用 strcpy而需要复制其他类型数据时则用 memcpy。先记住核心区别strcpy按 **\0 终止 **memcpy只按指定字节 size拷贝完全不识别字符串结束符。坑 1忘记手动拷贝字符串结束符\0最高频错误字符串合法的前提是末尾有\0memcpy 不会自动补。错误示例char src[] abc123; char dest[10]; // sizeof(src) 包含末尾\0没问题但很多人写成 strlen(src) memcpy(dest, src, strlen(src)); printf(dest); // 乱码无结束符越界读取内存原因strlen(abc123) 6只复制 6 个有效字符漏掉第 7 字节\0。正确两种写法带终止符拷贝memcpy(dest, src, strlen(src) 1);直接用 sizeof数组c运行memcpy(dest, src, sizeof(src));坑 2目标缓冲区过小内存越界覆盖缓冲区溢出char src[] HelloWorld123456; char dest[5]; // 只能存4字符结束符 memcpy(dest, src, strlen(src)1); // 严重越界覆盖栈上其他变量崩溃/数据错乱规避拷贝前校验strlen(src)1 sizeof(dest)。坑 3源和目标内存重叠memcpy 未做重叠处理行为未定义memcpy 标准不保证重叠安全重叠场景要用 memmove。错误示例char buf[] 123456789; // 目标在源区间内部重叠 memcpy(buf 2, buf, 5); // 预期12123456789实际数据被提前覆盖结果错乱解决内存存在重叠一律改用memmove。坑 4size 传错混淆字节数与字符个数宽字符尤其致命窄 char 场景易错点char src[] abcd; memcpy(dest, src, 4); // 丢\0wchar_t 宽字符串大坑极易踩wchar_t 一个字符占 2/4 字节不能直接用 strlen 算长度传给 memcpyc运行wchar_t wsrc[] Ltest; // 错误wcslen得到字符数不是字节数 memcpy(wdest, wsrc, wcslen(wsrc)); // 正确字节数 字符数 * sizeof(wchar_t) memcpy(wdest, wsrc, (wcslen(wsrc)1)*sizeof(wchar_t));坑 5空指针传入 memcpy直接程序崩溃char *src NULL; char dest[20]; memcpy(dest, src, 5); // 解引用空指针段错误规避拷贝前判空指针。坑 6const 与指针类型不匹配编译警告 / 截断源字符串是const char*传给 memcpy 第二个参数没问题 但如果强转、混用无符号 /char 指针部分编译器会告警极端平台截断高位字节。坑 7栈局部字符串拷贝后未初始化残留干扰目标数组只拷贝前 N 字节后面内存是随机脏数据若忘记\0打印会读到残留垃圾。char dest[16] {0}; // 初始化为0最稳妥坑 8混用 memcpy /strcpy 逻辑思维惯性出错strcpy自动读到\0停止不用管长度memcpy必须精确提供总字节含\0 很多人写惯 strcpy用 memcpy 时下意识只传有效字符长度必出乱码。