memcpy
?是 C 語言標準庫中的一個重要函數,用于在內存區域之間復制數據。它是?<string.h>
?頭文件中定義的高效內存操作函數之一。
函數原型
void *memcpy(void *dest, const void *src, size_t n);
參數說明
-
dest
: 目標內存地址,數據將被復制到這里 -
src
: 源內存地址,數據從這里復制 -
n
: 要復制的字節數
返回值
返回目標內存地址?dest
?的指針。
基本用法
#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[20];// 復制 src 的內容到 destmemcpy(dest, src, strlen(src) + 1); // +1 是為了包含字符串結束符 '\0'printf("源字符串: %s\n", src);printf("目標字符串: %s\n", dest);return 0;
}
重要注意事項
-
內存重疊問題:
-
memcpy
?不處理內存重疊的情況。如果源和目標內存區域重疊,行為是未定義的。 -
對于重疊內存區域,應該使用?
memmove
?函數。
-
-
邊界檢查:
-
必須確保目標緩沖區足夠大,以避免緩沖區溢出。
-
-
類型無關:
-
memcpy
?可以用于任何數據類型,因為它按字節操作。
-
結構體復制示例
#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s1 = {1, "Alice", 95.5};Student s2;// 復制結構體memcpy(&s2, &s1, sizeof(Student));printf("學生ID: %d\n", s2.id);printf("學生姓名: %s\n", s2.name);printf("學生成績: %.1f\n", s2.score);return 0;
}
性能考慮
memcpy
?通常經過高度優化,比手動編寫的循環復制要快得多,特別是對于大塊數據。
與 strcpy 的區別
-
strcpy
?用于以 null 結尾的字符串,遇到 '\0' 停止復制 -
memcpy
?嚴格按指定的字節數復制,不考慮任何終止符
安全替代品
在一些安全敏感的編程環境中,可以考慮使用更安全的版本:
-
memcpy_s
?(C11 標準) -
或者自己實現帶有邊界檢查的版本