首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

memcpy 與 strcpy 核心區別深度解析

     編輯:關於C語言

函數原型


void *memcpy(void *dest, const void *src, size_t n);
char *strcpy(char *dest, const char *src);

核心區別對比表

維度memcpystrcpy
複製單位字節字符 (以 '\0' 結束)
長度控制由參數 n 顯式指定隱式:遇到源串 '\0' 停止
適用數據任意二進制數據 (含 '\0')僅限 C 風格字符串
內存重疊行為未定義 (需用 memmove)行為未定義
返回值指向 dest指向 dest
性能通常優化為向量化指令 (SSE/AVX),大塊複製極快逐字符複製,難以向量化

典型使用場景

memcpy

  • 結構體/數組整體拷貝:memcpy(&dst, &src, sizeof(Struct))
  • 二進制緩衝區操作:網絡包組裝、文件讀寫、圖像處理。
  • 已知長度的字符串複製 (避免掃描 '\0'):memcpy(dst, src, len+1)。

strcpy

  • 字符串賦值/拼接 (配合 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:安全處理源/目標重疊區域。
  • 現代 C++ 優先用 std::string、std::vector、std::copy、std::copy_n,避免裸指針操作。

總結

memcpy 是通用內存複製工具,strcpy 是字符串專用工具。 需複製二進制數據、已知長度、追求極致性能時用 memcpy;處理以 '\0' 結束的字符串、代碼可讀性優先時用 strcpy (或更安全的 strcpy_s/std::string)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved