三分钟带你读懂`strcpy`和`memcpy`
# 字符串与内存操作函数:strcpy vs memcpy
## 📌 1. strcpy函数
### 基本说明
```c
char* strcpy(char* dest, const char* src);
- 功能:将
src指向的字符串(包括结束符\0)复制到dest - 要求:
src必须是有效的以\0结尾的字符串 - 返回值:目标字符串的起始地址(即
dest)
关键特性
- ⚠️ 不检查目标缓冲区大小(可能导致缓冲区溢出)
- 🚫 遇到
\0自动停止复制 - 🔁 完全覆盖
dest的原始内容
代码示例
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello DeepSeek!";
char dest[20];
strcpy(dest, src); // 复制字符串
printf("复制结果: %s\n", dest); // 输出: Hello DeepSeek!
return 0;
}
使用场景
- 字符串的完整复制
- 已知目标缓冲区足够大的情况
📌 2. memcpy函数
基本说明
void* memcpy(void* dest, const void* src, size_t n);
- 功能:从
src复制n字节的原始数据到dest - 参数:
n指定要复制的字节数 - 返回值:目标内存的起始地址(即
dest)
关键特性
- 🔧 操作任意二进制数据(不限于字符串)
- 🛡️ 不检查
\0结束符(严格按字节数复制) - ⚡ 通常比strcpy更快(无结束符检查开销)
代码示例
#include <stdio.h>
#include <string.h>
int main() {
int src[] = {1, 2, 3, 4};
int dest[4];
memcpy(dest, src, sizeof(src)); // 复制16字节数据
for(int i=0; i<4; i++)
printf("%d ", dest[i]); // 输出: 1 2 3 4
return 0;
}
使用场景
- 结构体/数组等二进制数据复制
- 需要精确控制复制字节数时
- 内存重叠时需改用
memmove
🆚 核心区别对比表
| 特性 | strcpy | memcpy |
|---|---|---|
| 操作对象 | 字符串 | 任意内存数据 |
| 结束条件 | 遇到\0自动停止 |
严格按指定字节数复制 |
| 安全性 | 可能溢出(无长度检查) | 需手动确保长度有效 |
| 速度 | 相对较慢(需扫描结束符) | 更快(直接内存操作) |
| 参数差异 | 无长度参数 | 需显式指定字节数n |
| 重叠处理 | 未定义行为 | 未定义行为(需用memmove) |
💡 最佳实践建议
- 优先用
memcpy处理非字符串数据(如结构体) - 使用
strcpy时务必确保目标缓冲区足够大 - 考虑更安全的替代方案:
strncpy:带长度限制的字符串复制memmove:支持内存重叠的复制snprintf:格式化安全复制
- 在C++中推荐使用
std::string和std::copy避免内存问题
⚠️ 危险操作警示:
永远不要这样写!
char buf[10];
strcpy(buf, "This string is too long!"); // 缓冲区溢出!

浙公网安备 33010602011771号