国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn)

這篇具有很好參考價值的文章主要介紹了【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.memcpy

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

功能:把source指向的前num個字節(jié)內容拷貝到destination指向的位置去,可以拷貝任意類型的數(shù)據(jù)。

注:1.memcpy并不關心\0,畢竟傳的也不一定是字符串,因此拷貝過程中遇到\0也不會停下來。

2.num的單位是字節(jié),并不是要拷貝的元素個數(shù)

3.如果source和destination有任何的重疊,拷貝的結果都是未定義的。什么意思呢?舉個例子,我現(xiàn)在要把arr1中的12345拷貝到34567的位置上去。

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

打印結果卻并沒有如愿,這是因為當我們把1拷貝到了3的位置上,2拷貝到了4的位置上,數(shù)組arr1的內容已經(jīng)被改變了,當我們要拷貝3到5的位置上時,3已經(jīng)變成了1,于是就把1拷貝過去了。于是出現(xiàn)了上圖所示的情況。

也就是說memcpy只用于處理不重疊內存的數(shù)據(jù)。

模擬實現(xiàn)memcpy

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

像這種能夠操作各種類型數(shù)據(jù)的函數(shù),其底層實現(xiàn)原理基本上都和char*類型的指針有關系,比如memcpy,還有我們前面已經(jīng)模擬實現(xiàn)過的庫函數(shù)qsort。因為char*類型的指針走一步就跳過一個字節(jié),字節(jié)又是內存單元的最小單位,不管是什么類型的數(shù)據(jù),只要一個字節(jié)一個字節(jié)的操作,最終都可以達成目的。

因此在這里我們就把des和src兩個指針強制類型轉換成char*類型的,然后解引用對他們指向的那一個字節(jié)單元的內容進行賦值操作,賦值完一個字節(jié)之后再進行下一個字節(jié)單元的操作。注意強制類型轉換只是一個臨時的操作,并不是說我們在進行賦值的時候把des和src強制類型轉換成char*類型的了,他就一直是char*類型的了,因此要讓des和src指向下一個字節(jié)單元,應該寫成des=(char*)des+1。

2.memmove

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

功能:也是拷貝內存數(shù)據(jù)

和memcpy的差別就是memmove函數(shù)處理的源內存塊和目標內存塊是可以重疊的。如果源空間和目標空間出現(xiàn)重疊,就得使用memmove函數(shù)處理。

像剛才那個例子,我們就可以使用memmove解決

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

模擬實現(xiàn)memmove

【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn),數(shù)據(jù)結構,c語言,算法,c++,開發(fā)語言

思路:要在有重疊的數(shù)據(jù)里面實現(xiàn)拷貝,最大的問題就是在拷貝的過程中會改變原來位置的內容,第一想法是可以申請一塊內存在里面存放原本數(shù)據(jù)的相同內容,這樣當然可以,但是第一這種寫法比較麻煩,第二會造成內存的浪費。能不能不申請內存就實現(xiàn)在同一塊內存中拷貝內容呢?

當然可以,舉個例子,12345678這串數(shù)字,現(xiàn)在我要把345處的內容拷貝成123,也就是最終讓數(shù)字變成12123678,此時des在src的后面,如果我先把1拷貝到3的位置,那么后面在想把3拷貝到6處時就很尷尬,因為此時的3已經(jīng)變成了1,但是如果我倒著拷貝,先把3拷貝到6的地方,再把2拷貝到5的地方,再把1拷貝到3的地方,不就行了嗎?

再舉一個例子,如果我要把345拷貝到123的位置,此時des在src的前面,我們直接把3拷貝到1的位置,4拷貝到2的位置,5拷貝到3的位置即可。

也就是說,如果dessrc,就從后往前拷貝。如果兩塊數(shù)據(jù)沒有重疊,那從前或者從后都可以。

在代碼中從后往前找的時候,先判斷num是否為0,然后--,第一次的時候num是20,進入循環(huán)之后已經(jīng)--了,變成了19,因此(char*)des + num與(char*)src + num都指向了最后一個要拷貝的位置。并隨著num的減小不斷指向前面位置。

注:memcpy能做的,memmove都能做。但是memmove能做的,memcpy不一定能做。文章來源地址http://www.zghlxwxcb.cn/news/detail-826535.html

到了這里,關于【C語言】內存函數(shù)memcpy和memmove的功能與模擬實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C語言——內存操作函數(shù)(memcpy、memmove、memcmp、memset)

    C語言——內存操作函數(shù)(memcpy、memmove、memcmp、memset)

    本文章會詳解C語言進階內容,有關內存操作函數(shù)( memcpy,memmove,memcmp,memset )的使用說明、API文檔該類函數(shù)原型以及模擬實現(xiàn)內存函數(shù) 首先我們從API文檔中搜索memcpy查看一下該函數(shù)的原型 可以看出該函數(shù)有三個參數(shù),那么這三個參數(shù)的作用分別是什么呢? 該函數(shù)的實現(xiàn)思

    2024年02月06日
    瀏覽(41)
  • C語言—模擬實現(xiàn)memcpy,memmove

    C語言—模擬實現(xiàn)memcpy,memmove

    函數(shù)memcpy從source的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destination的內存位置。 這個函數(shù)在遇到 \\\'\\0\\\' 的時候并不會停下來。 如果source和destination有任何的重疊,復制的結果都是未定義的。 其實要實現(xiàn)memcpy非常的簡單,我們不管傳進來的是哪種數(shù)據(jù)類型都統(tǒng)一強轉為char*,我們知

    2024年02月15日
    瀏覽(23)
  • 來不及哀悼了,接下來上場的是C語言內存函數(shù)memcpy,memmove,memset,memcmp

    來不及哀悼了,接下來上場的是C語言內存函數(shù)memcpy,memmove,memset,memcmp

    今天又來寫一篇C的文章,這里要講的是C語言中的幾個內存函數(shù),主要是講解功能和用法,望能耐心觀看哦。望官方也多多曝光。 目錄 memcpy ?memmove memset ?memcmp ?memcpy??是?C?語言標準庫中的一個函數(shù),用于復制內存塊的內容。它的主要作用是將一個源內存區(qū)域的內容復制到

    2024年02月22日
    瀏覽(27)
  • 提升內功之模擬實現(xiàn)庫函數(shù)strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

    提升內功之模擬實現(xiàn)庫函數(shù)strlen/strncpy/strcmp/strcat/strstr/memcpy/memmove

    strlen函數(shù)的作用就是求字符串的首元素開始往后計算字符串的長度,直到’\\0‘,但不會把\\0的長度計算進去 strncpy的作用就是從source指向的字符串復制num個字節(jié)的內容到destination指向的字符串去 如果source的長度小于num,則填充0 注意source和destination的內容在空間上不要重疊,如

    2024年02月16日
    瀏覽(25)
  • 【C語言】memcpy,memmove,memcmp,memset函數(shù)詳解

    【C語言】memcpy,memmove,memcmp,memset函數(shù)詳解

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個人主頁 :阿然成長日記 ??點擊可跳轉 ?? 個人專欄: ??數(shù)據(jù)結構與算法??C語言進階 ?? 不能則學,不知則問,恥于問人,決無長進 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? #includestring.h 與strn

    2024年02月17日
    瀏覽(26)
  • memcpy、memmove、memcmp、memset函數(shù)的作用與區(qū)別

    作用: 從source的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destination的內存位置。 注意: memcpy() 函數(shù)在遇到 ’\\0’ 的時候 不會停下來 (strcpy字符串拷貝函數(shù)在遇到’\\0’的時候會停下來); destination和source 所指向的內容不能重疊, 否則得不到想要的結果。 void* memcpy(void* destination

    2024年02月14日
    瀏覽(26)
  • 【C語言】memmove()函數(shù)(拷貝重疊內存塊函數(shù)詳解)

    【C語言】memmove()函數(shù)(拷貝重疊內存塊函數(shù)詳解)

    ?? 個人主頁 :修修修也 ?? 所屬專欄 :C語言 ?? 操作環(huán)境 : Visual Studio 2022 目錄 ?一.memmove()函數(shù)簡介 1.函數(shù)功能 2.函數(shù)參數(shù) 1.void * destination 2.onst void * source 3.size_t num 3.函數(shù)返回值 4.函數(shù)頭文件 二.memmove()函數(shù)的具體使用 1.使用memmove()函數(shù)完成拷貝整型數(shù)組數(shù)據(jù)(目的地與源重

    2024年02月06日
    瀏覽(22)
  • 【C語言】memcpy()函數(shù)(內存塊拷貝函數(shù))

    【C語言】memcpy()函數(shù)(內存塊拷貝函數(shù))

    ?? 個人主頁 :修修修也 ?? 所屬專欄 :C語言 ?? 操作環(huán)境 : Visual Studio 2022 目錄 一.memcpy()函數(shù)簡介 ??函數(shù)功能 ??函數(shù)參數(shù) ??void * destination ??const void * source ??size_t num ??函數(shù)返回值 ??函數(shù)頭文件 二.memcpy()函數(shù)的具體使用 ??使用memcpy()函數(shù)完成拷貝整型數(shù)組數(shù)據(jù) ??使

    2024年02月05日
    瀏覽(24)
  • C語言——內存函數(shù)的使用與模擬實現(xiàn)

    C語言——內存函數(shù)的使用與模擬實現(xiàn)

    大家好,我是殘念,希望在你看完之后,能對你有所幫助,有什么不足請指正!共同學習交流 本文由:殘念ing 原創(chuàng)CSDN首發(fā),如需要轉載請通知 個人主頁:殘念ing-CSDN博客,歡迎各位→點贊?? + 收藏?? + 留言?? ??系列專欄:殘念ing 的C語言系列專欄——CSDN博客 ? 目錄 前

    2024年02月02日
    瀏覽(20)
  • 【C語言】——內存函數(shù)的使用及模擬實現(xiàn)

    【C語言】——內存函數(shù)的使用及模擬實現(xiàn)

    ??在【C語言】——字符串函數(shù)的使用與模擬實現(xiàn)(上)與【C語言】——字符串函數(shù)的使用與模擬實現(xiàn)(下)二文中,我曾詳細介紹了字符串相關函數(shù)的具體功能及其模擬實現(xiàn)。 ?? ??然而,實踐過程中,我們往往不僅僅只是處理字符串類型的變量,若要對浮點型、整型

    2024年04月28日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包