C語(yǔ)言中memcpy 的使用示例詳解
memcpy是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中用于內(nèi)存復(fù)制的核心函數(shù),能夠高效地將指定字節(jié)數(shù)的數(shù)據(jù)從源地址復(fù)制到目標(biāo)地址。它在處理非重疊內(nèi)存區(qū)域的批量數(shù)據(jù)拷貝時(shí)表現(xiàn)出色,廣泛應(yīng)用于結(jié)構(gòu)體復(fù)制、數(shù)組拷貝等場(chǎng)景。本文將從函數(shù)原型、使用場(chǎng)景、注意事項(xiàng)等方面展開(kāi)分析,并結(jié)合實(shí)際代碼示例說(shuō)明其正確用法。
memcpy 是 C 語(yǔ)言中非常重要的一個(gè)函數(shù),用于內(nèi)存塊的復(fù)制。它定義在標(biāo)準(zhǔn)頭文件 <string.h> 中。
?? 函數(shù)原型
void *memcpy(void *dest, const void *src, size_t n);
參數(shù)說(shuō)明:
| 參數(shù) | 類型 | 含義 |
|---|---|---|
dest | void * | 目標(biāo)內(nèi)存地址(要復(fù)制到哪里) |
src | const void * | 源內(nèi)存地址(從哪里復(fù)制) |
n | size_t | 要復(fù)制的字節(jié)數(shù) |
返回值:
- 返回指向目標(biāo)內(nèi)存
dest的指針(即第一個(gè)參數(shù))。 - 通??梢院雎苑祷刂?,但在鏈?zhǔn)秸{(diào)用或需要檢查時(shí)有用。
? 使用步驟與要點(diǎn)
- 包含頭文件
#include <string.h>
- 確保目標(biāo)空間足夠大
dest必須有足夠的內(nèi)存空間容納n個(gè)字節(jié),否則會(huì)導(dǎo)致緩沖區(qū)溢出和未定義行為。
- 避免內(nèi)存重疊
- 如果源和目標(biāo)內(nèi)存區(qū)域有重疊,使用
memcpy會(huì)導(dǎo)致未定義行為。 - 此時(shí)應(yīng)使用
memmove,它是安全處理重疊內(nèi)存的版本。
- 如果源和目標(biāo)內(nèi)存區(qū)域有重疊,使用
?? 示例代碼
示例 1:基本用法 —— 復(fù)制數(shù)組
#include <stdio.h>
#include <string.h>
int main() {
int src[] = {10, 20, 30, 40, 50};
int dest[5];
// 復(fù)制 5 個(gè)整數(shù)(每個(gè) int 通常是 4 字節(jié),共 20 字節(jié))
memcpy(dest, src, sizeof(src));
for (int i = 0; i < 5; i++) {
printf("%d ", dest[i]); // 輸出: 10 20 30 40 50
}
return 0;
}示例 2:復(fù)制結(jié)構(gòu)體
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char name[20];
float score;
} Student;
int main() {
Student s1 = {1001, "Alice", 95.5f};
Student s2;
memcpy(&s2, &s1, sizeof(Student));
printf("ID: %d, Name: %s, Score: %.1f\n",
s2.id, s2.name, s2.score);
// 輸出: ID: 1001, Name: Alice, Score: 95.5
return 0;
}示例 3:復(fù)制字符串(非最佳實(shí)踐)
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, world!";
char dest[50];
memcpy(dest, src, strlen(src) + 1); // +1 包含 '\0'
printf("Copied string: %s\n", dest);
return 0;
}?? 注意:對(duì)于字符串,推薦使用 strcpy 或更安全的 strncpy / strlcpy / snprintf。
?? 常見(jiàn)錯(cuò)誤與陷阱
| 錯(cuò)誤 | 說(shuō)明 |
|---|---|
| ? 目標(biāo)空間不足 | char dest[10]; memcpy(dest, src, 100); → 寫(xiě)越界,崩潰或安全漏洞 |
| ? 源指針為空 | memcpy(dest, NULL, n) → 崩潰 |
| ? 目標(biāo)指針為空 | memcpy(NULL, src, n) → 崩潰 |
| ? 內(nèi)存重疊 | memcpy(buf+1, buf, 10); → 未定義行為!應(yīng)改用 memmove |
? 正確做法示例(使用 memmove 處理重疊):
char buf[] = "abcdef"; memmove(buf + 1, buf, 5); // 將 "abcde" 左移一位 // 結(jié)果: "aabcde"
??memcpyvsmemmove
| 函數(shù) | 是否支持內(nèi)存重疊 | 性能 | 推薦場(chǎng)景 |
|---|---|---|---|
memcpy | ? 不保證 | 更快 | 確定無(wú)重疊時(shí)使用 |
memmove | ? 安全支持 | 稍慢 | 可能存在重疊時(shí)使用 |
建議:如果不確定是否重疊,優(yōu)先使用
memmove。
??? 技巧:復(fù)制部分?jǐn)?shù)據(jù)
double data[100]; double subset[10]; // 只復(fù)制前 10 個(gè) double memcpy(subset, data, 10 * sizeof(double));
? 安全使用建議
- 使用
sizeof()計(jì)算大小,避免硬編碼。 - 確保目標(biāo)緩沖區(qū)已分配且足夠大。
- 對(duì)于字符串操作,考慮使用更高層函數(shù)(如
strcpy,strncpy)。 - 避免跨線程共享未保護(hù)的內(nèi)存拷貝。
- 在嵌入式或性能敏感場(chǎng)景中,
memcpy是高效選擇。
?? 小結(jié):一句話記住memcpy
“按字節(jié)復(fù)制一塊內(nèi)存,不管內(nèi)容是什么。”
它不關(guān)心你復(fù)制的是 int、float、結(jié)構(gòu)體還是字符串 —— 它只是把一串字節(jié)從一個(gè)地方搬到另一個(gè)地方。
如果你是在實(shí)現(xiàn)序列化、解析協(xié)議、操作二進(jìn)制數(shù)據(jù)等底層任務(wù),memcpy 是不可或缺的工具。但務(wù)必小心使用,防止內(nèi)存錯(cuò)誤!
到此這篇關(guān)于C語(yǔ)言中memcpy 的使用示例詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 memcpy使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言實(shí)現(xiàn)memcpy函數(shù)的使用示例
- 詳解C語(yǔ)言中strcpy函數(shù)與memcpy函數(shù)的區(qū)別與實(shí)現(xiàn)
- C語(yǔ)言內(nèi)存函數(shù) memcpy,memmove ,memcmp
- C語(yǔ)言函數(shù)之memcpy函數(shù)用法實(shí)例
- C語(yǔ)言?模擬實(shí)現(xiàn)memcpy與memmove函數(shù)詳解
- C語(yǔ)言中memcpy 函數(shù)的用法詳解
- C語(yǔ)言 strcpy和memcpy區(qū)別詳細(xì)介紹
- 對(duì)比C語(yǔ)言中memccpy()函數(shù)和memcpy()函數(shù)的用法
相關(guān)文章
利用C語(yǔ)言實(shí)現(xiàn)單詞文本計(jì)數(shù)
這篇文章主要為大家詳細(xì)介紹了如何編寫(xiě)一個(gè)C語(yǔ)言程序,用于統(tǒng)計(jì)一個(gè)文本文件中每個(gè)單詞出現(xiàn)的次數(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
C語(yǔ)言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸出鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn),主要涉及鏈表的遍歷操作,是數(shù)據(jù)結(jié)構(gòu)中鏈表的常見(jiàn)操作。需要的朋友可以參考下2014-09-09
一篇文章帶你了解C語(yǔ)言:入門(mén)基礎(chǔ)(2)
這篇文章主要介紹了C語(yǔ)言入門(mén)之基礎(chǔ)知識(shí)詳解,文中有非常詳細(xì)的C語(yǔ)言使用教程及相關(guān)基礎(chǔ)知識(shí),對(duì)正在學(xué)習(xí)c語(yǔ)言的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-08-08
C語(yǔ)言切割多層字符串(strtok_r strtok使用方法)
這篇文章主要介紹了C語(yǔ)言切割多層字符串的方法,說(shuō)了strtok的弱點(diǎn),使用strtok_r的方法2013-11-11

