最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中memcpy 的使用示例詳解

 更新時(shí)間:2025年09月15日 17:02:10   作者:yuyousheng_  
memcpy是C語言中非常重要的一個(gè)函數(shù),用于內(nèi)存塊的復(fù)制,它定義在標(biāo)準(zhǔn)頭文件 <string.h> 中,這篇文章給大家介紹C語言 memcpy的使用,感興趣的朋友跟隨小編一起看看吧

memcpy是C語言標(biāo)準(zhǔn)庫中用于內(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)等方面展開分析,并結(jié)合實(shí)際代碼示例說明其正確用法。

memcpy 是 C 語言中非常重要的一個(gè)函數(shù),用于內(nèi)存塊的復(fù)制。它定義在標(biāo)準(zhǔn)頭文件 <string.h> 中。

?? 函數(shù)原型

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

參數(shù)說明:

參數(shù)類型含義
destvoid *目標(biāo)內(nèi)存地址(要復(fù)制到哪里)
srcconst void *源內(nèi)存地址(從哪里復(fù)制)
nsize_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)存的版本。

?? 示例代碼

示例 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。

?? 常見錯(cuò)誤與陷阱

錯(cuò)誤說明
? 目標(biāo)空間不足char dest[10]; memcpy(dest, src, 100); → 寫越界,崩潰或安全漏洞
? 源指針為空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? 不保證更快確定無重疊時(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));

? 安全使用建議

  1. 使用 sizeof() 計(jì)算大小,避免硬編碼。
  2. 確保目標(biāo)緩沖區(qū)已分配且足夠大。
  3. 對(duì)于字符串操作,考慮使用更高層函數(shù)(如 strcpy, strncpy)。
  4. 避免跨線程共享未保護(hù)的內(nèi)存拷貝。
  5. 在嵌入式或性能敏感場(chǎng)景中,memcpy 是高效選擇。

?? 小結(jié):一句話記住memcpy

“按字節(jié)復(fù)制一塊內(nèi)存,不管內(nèi)容是什么。”

它不關(guān)心你復(fù)制的是 intfloat、結(jié)構(gòu)體還是字符串 —— 它只是把一串字節(jié)從一個(gè)地方搬到另一個(gè)地方。

如果你是在實(shí)現(xiàn)序列化、解析協(xié)議、操作二進(jìn)制數(shù)據(jù)等底層任務(wù),memcpy 是不可或缺的工具。但務(wù)必小心使用,防止內(nèi)存錯(cuò)誤!

到此這篇關(guān)于C語言中memcpy 的使用示例詳解的文章就介紹到這了,更多相關(guān)C語言 memcpy使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請(qǐng)求,本文主要給大家介紹了C++實(shí)現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下
    2024-05-05
  • C++開發(fā)之CRC校驗(yàn)實(shí)例詳解

    C++開發(fā)之CRC校驗(yàn)實(shí)例詳解

    這篇文章主要介紹了C++開發(fā)之CRC校驗(yàn)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++中Digraphs、Trigraphs和Tokens的深入講解

    C++中Digraphs、Trigraphs和Tokens的深入講解

    這篇文章主要給大家介紹了關(guān)于C++中Digraphs、Trigraphs和Tokens的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 關(guān)于C++地址交換的實(shí)現(xiàn)

    關(guān)于C++地址交換的實(shí)現(xiàn)

    在C++中,地址交換通常是指通過指針操作改變兩個(gè)變量之間的內(nèi)存地址引用,當(dāng)你有兩個(gè)指針分別指向兩個(gè)變量時(shí),你可以通過某種機(jī)制交換這兩個(gè)指針的內(nèi)容,使得它們各自指向?qū)Ψ皆瓉淼奈恢?本介紹了關(guān)于C++地址交換的實(shí)現(xiàn),需要的朋友可以參考下
    2024-11-11
  • 一文詳解C++11中的lambda函數(shù)

    一文詳解C++11中的lambda函數(shù)

    小編可以明確告訴大家:lambda函數(shù)是C++11中最重要的,使用最廣泛的,最具現(xiàn)代風(fēng)格的內(nèi)容,lambda函數(shù)的出現(xiàn)改變了C++編程的思維方式。所以快和小編學(xué)習(xí)一下C++11中l(wèi)ambda函數(shù)的使用吧
    2023-02-02
  • C語言學(xué)生成績(jī)管理系統(tǒng)源代碼

    C語言學(xué)生成績(jī)管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生成績(jī)管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • c++ 深入理解歸并排序的用法

    c++ 深入理解歸并排序的用法

    歸并排序是典型分治思想的代表——首先把原問題分解為兩個(gè)或多個(gè)子問題,然后求解子問題的解,最后使用子問題的解來構(gòu)造出原問題的解
    2022-03-03
  • Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍

    Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍

    在日常開發(fā)過程中QLineEdit作為輸入框,有時(shí)要限制輸入的內(nèi)容,這篇文章主要給大家介紹了關(guān)于Qt實(shí)現(xiàn)QLineEdit輸入前提示輸入范圍并用正則表達(dá)式限制輸入范圍的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Qt控件之QPushButton使用及技巧

    Qt控件之QPushButton使用及技巧

    QPushButton類是Qt中用于創(chuàng)建按鈕的控件類,它繼承自QAbstractButton類,本文就來介紹一下Qt控件之QPushButton使用及技巧,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C語言代碼實(shí)現(xiàn)2048游戲

    C語言代碼實(shí)現(xiàn)2048游戲

    這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)2048游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02

最新評(píng)論

芦山县| 聂荣县| 济阳县| 太仓市| 禄劝| 荥阳市| 莲花县| 达日县| 额尔古纳市| 明光市| 阿克陶县| 雅江县| 三明市| 三台县| 皋兰县| 拜泉县| 抚州市| 商洛市| 吴川市| 清远市| 西平县| 永平县| 鄂州市| 湘潭县| 启东市| 大新县| 顺平县| 酒泉市| 竹山县| 柞水县| 星座| 和静县| 井冈山市| 府谷县| 襄垣县| 岢岚县| 东城区| 海城市| 宣恩县| 陆丰市| 临颍县|