核心差異
| 函數 | 原型 | 停止條件 | 適用場景 |
strcpy | char *strcpy(char *dest, const char *src) | 遇到 \0 結束 | 以 \0 結尾的 C 字串 |
memcpy | void *memcpy(void *dest, const void *src, size_t n) | 複製指定 n 位元組 | 任意二進位資料、含內嵌 \0 的緩衝區 |
含 \0 字串複製正確姿勢
// 來源緩衝區包含內嵌 \0,已知總長度 len
char src[] = {'a', 'b', '\0', 'c', 'd'}; // 長度 5
char dest[5];
// ❌ 錯誤:strcpy 遇到第一個 \0 停止,只複製 "ab"
strcpy(dest, src); // dest = "ab\0??"
// ✅ 正確:memcpy 複製完整 5 位元組
memcpy(dest, src, 5); // dest = "ab\0cd"
memcpy 使用關鍵注意事項
- 目的緩衝區必須預先分配足夠空間:
dest 指向至少 n 位元組可寫記憶體。
- 記憶體區域不可重疊:重疊行為未定義,需用
memmove。
- 不自動添加 \0:若需 C 字串,手動
dest[n] = '\0'。
常見錯誤:未初始化 dest
char *dest; // 未分配記憶體!
memcpy(dest, src, len); // 段錯誤:寫入野指標
// 正確
char *dest = malloc(len);
if (dest) memcpy(dest, src, len);
總結選擇指南
已知長度、可能含 \0、二進位資料 → memcpy / memmove
標準 C 字串 (單一 \0 結尾) → strcpy / strncpy / strlcpy
字串拼接 → strcat / strncat / strlcat