三分钟带你读懂`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

💡 最佳实践建议

  1. 优先用memcpy处理非字符串数据(如结构体)
  2. 使用strcpy时务必确保目标缓冲区足够大
  3. 考虑更安全的替代方案:
    • strncpy:带长度限制的字符串复制
    • memmove:支持内存重叠的复制
    • snprintf:格式化安全复制
  4. 在C++中推荐使用std::stringstd::copy避免内存问题

⚠️ 危险操作警示
永远不要这样写!
char buf[10];
strcpy(buf, "This string is too long!"); // 缓冲区溢出!

posted @ 2025-08-01 11:00  Rare_30  阅读(49)  评论(0)    收藏  举报