1. memcpy
是什麼?基本介紹
在 C 語言處理記憶體時,資料複製是一個非常重要的操作。其中最具代表性的就是 memcpy
。這是一個可以將一個記憶體區塊的資料,以位元組為單位複製到另一個區塊的函式。你可以想像成「把箱子 A 的物品原封不動搬到箱子 B」。不過,memcpy
有一些需要特別注意的地方。如果沒有正確指定大小或區域,資料可能會損壞,甚至導致程式當機。
2. memcpy
的原理與運作
memcpy
的函式宣告如下:
void *memcpy(void *dest, const void *src, size_t n);
dest
是複製的目的地,src
是來源,n
是要複製的位元組數。例如,下面的程式碼可以複製陣列內容:
char src[10] = "ABCDEF";
char dest[10];
memcpy(dest, src, 6); // 複製 "ABCDEF"
這段程式會將 src
前 6 個位元組複製到 dest
。重要的是要確認複製的資料大小與來源、目的地的大小一致。如果大小不一致,程式可能會出現預期外的行為。

3. memcpy
的陷阱
memcpy
最大的陷阱就是記憶體區塊重疊的問題。memcpy
在記憶體重疊的情況下,無法正常運作。例如,下面的程式碼可能會出現問題:
char data[] = "HelloWorld";
memcpy(data + 2, data, 5);
這段程式碼的來源和目的地有重疊,所以複製結果可能會損壞。遇到這種情況時,應該使用 memmove
。memmove
會考慮重疊情形,能安全地進行複製。
4. memcpy
的最佳實踐
以下介紹幾個安全使用 memcpy
的最佳做法:
- 確認大小:一定要確認複製的位元組數是否正確。如果目的地空間太小,會發生記憶體覆蓋(緩衝區溢位),造成資安風險。
- 檢查 NULL 指標:
src
或dest
為 NULL 時,程式會當機。使用前務必檢查指標是否正確。 - 避免重疊區域:
memcpy
不要用在重疊的記憶體區塊,若有需要請改用memmove
。

5. memcpy
的效能與優點
memcpy
最大的優點就是速度快。在許多系統中,memcpy
已經在硬體層面做了最佳化,非常適合用於非重疊記憶體區塊的大量資料複製。例如,當需要將大型緩衝區或檔案資料載入記憶體時,memcpy
是非常有效率的選擇。
不過,為了追求效能而濫用 memcpy
並不可取。特別是在記憶體重疊或資安要求高的場合,應考慮使用 memmove
或其他更安全的函式。
6. memcpy
的替代方案:memmove
及其他選擇
memcpy
雖然非常方便,但替代方案也應該記住。memmove
適用於記憶體區塊重疊的情況,可以安全複製資料。例如,下面這樣使用 memmove
,可以安全地搬移資料:
char data[] = "HelloWorld";
memmove(data + 2, data, 5);
這時候,memmove
會正確且不會損壞資料。另外,依據用途不同,也可以考慮 strcpy
或 strncpy
等更適合的函式,靈活選擇很重要。
7. 總結
本文介紹了 C 語言 memcpy
的原理、陷阱、最佳實踐及替代函式。memcpy
是非常實用的工具,但要安全使用必須謹慎。特別要注意記憶體安全與大小確認。最後再提醒一次,如果記憶體區塊有重疊情形,請果斷使用 memmove
。這樣你的程式就更安全、更安心了!