void *memcpy(void *dest, const void *src, size_t n);
char *strcpy(char *dest, const char *src);
| 維度 | memcpy | strcpy |
|---|---|---|
| 複製單位 | 字節 | 字符 (以 '\0' 結束) |
| 長度控制 | 由參數 n 顯式指定 | 隱式:遇到源串 '\0' 停止 |
| 適用數據 | 任意二進制數據 (含 '\0') | 僅限 C 風格字符串 |
| 內存重疊 | 行為未定義 (需用 memmove) | 行為未定義 |
| 返回值 | 指向 dest | 指向 dest |
| 性能 | 通常優化為向量化指令 (SSE/AVX),大塊複製極快 | 逐字符複製,難以向量化 |
memcpy(&dst, &src, sizeof(Struct))memcpy(dst, src, len+1)。strcat)。strcpy(buf, "hello")。
#include
#include
int main() {
char *src = "Golden Global View";
char dst[20];
// 1. 完整複製字符串 (含結束符)
memcpy(dst, src, strlen(src) + 1);
printf("memcpy: %s\n", dst); // Golden Global View
// 2. 截取子串 "View" (從偏移 14 開始,長度 4)
memcpy(dst, src + 14, 4);
dst[4] = '\0'; // 手動添加結束符
printf("sub: %s\n", dst); // View
// 3. 初始化數組為 0
char msg[10];
memcpy(msg, "", sizeof(msg)); // 或 memset(msg, 0, sizeof(msg))
return 0;
}
memcpy_s (C11 Annex K) / strcpy_s:增加目標緩衝區大小參數,防止溢出。memmove:安全處理源/目標重疊區域。std::string、std::vector、std::copy、std::copy_n,避免裸指針操作。memcpy 是通用內存複製工具,strcpy 是字符串專用工具。 需複製二進制數據、已知長度、追求極致性能時用 memcpy;處理以 '\0' 結束的字符串、代碼可讀性優先時用 strcpy (或更安全的 strcpy_s/std::string)。