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

C語言模擬實現(xiàn)memmove的示例代碼

 更新時間:2022年12月29日 15:30:00   作者:ZHENGZJM  
memmove函數(shù)用于拷貝字節(jié),如果目標區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標區(qū)域中,但復制后源內(nèi)容會被更改。本文主要介紹了C語言模擬實現(xiàn)memmove的示例代碼,需要的可以參考一下

前言

上一篇我們介紹了memcpy和strcpy的區(qū)別,以及memcpy模擬實現(xiàn),但這兩個庫函數(shù)都有一個缺點,那就是不能自己復制自己的內(nèi)容

例子

這有一個數(shù)組arr,其元素分別為1、2、3、4、5、6、7、8、9、10,我們想將1、2、3、4復制到2的后面,從而將數(shù)組arr變成1、2、1、2、3、4、7、8、9、10

用memcpy嘗試

我們發(fā)現(xiàn),跟我們預期的 1、2、1、2、3、4、7、8、9、10有出入。

錯誤原因

int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memcpy(arr + 2, arr, 16);

memcpy實現(xiàn)過程

void* my_memcpy(void* dest, void* src, size_t count)
{
    void* ret = dest;
    while (count--)
    {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
    }
    return ret;
} 

當我們這樣操作時,src一開始指向1,1被復制到了3的位置上,后面指向2,2被復制到4的位置上,當src指針指向原來的3時,指向的內(nèi)容變成了1,又將1復制到了5的位置上,當src指向原來的4時,指向的內(nèi)容變成了2,又將2復制到了6的位置上。所以就出錯了。

用memmove嘗試

我們發(fā)現(xiàn)目的達到了,說明memmove適用于內(nèi)存發(fā)生重疊的情況。那么memmove是怎么實現(xiàn)的呢?

memmove的模擬實現(xiàn)

整段代碼

void* my_memmove(void* dest, void* src, size_t count)
{
	void* ret = dest;
	if (dest < src)
	{
		while (count--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}
	}
	return ret;
}

memmove的定義

由圖可知,memmove的返回值是目標地址,形勢參數(shù)分別是(目標地址,源頭地址,需要操作的字節(jié)數(shù))

具體實現(xiàn)步驟

第一種情況(dest在src后),采用由后向前復制

由上面的錯誤分析,我們知道是因為后面要被復制過去的內(nèi)容被更改了,還是用上面的例子做示范,我們從1開始復制的話,1會將3覆蓋掉,進而導致想將3復制到到5的位置上時,實際上是將1復制到5的位置上。

那么我們?nèi)绻麖?開始復制呢?我們由后至前進行復制,將4復制到6,再將3復制到5,這樣我們就不怕3、4被1、2覆蓋掉了。

我們要想先將4復制到6,先得將src指向4,dest指向6,然后再進行交換。我們用加傳過去的字節(jié)數(shù)來實現(xiàn)。

*((char*)dest + count) = *((char*)src + count);

我們想將指針前移,直接count減一就行,又因為我們要重復這一行為,所以我們使用while循環(huán)來實現(xiàn)。

        while (count--)
		{
			*((char*)dest + count) = *((char*)src + count);
		}

第二種情況(dest在src前),采用由前向后復制

如果dest在src前,我們還能用由后至前的方法復制嗎?

例如,我們將3、4、5、6向前移動2次,也就是將1、2、3、4、5、6、7、8、9、10變成3、4、5、6、5、6、7、8、9、10

我們發(fā)現(xiàn)并沒有成為我們想象當中的樣子。

錯誤原因

依然是要被復制的內(nèi)容在被復制之前就被更改了,這里先將6移動到4,5移動到3,想將4移動到2時,實際上復制過去的是6,以此類推...

所以我們要采用由前向后復制的方法(【C語言】字符串拷貝函數(shù)(strcpy)與內(nèi)存拷貝函數(shù)的不同及內(nèi)存拷貝函數(shù)(memcpy)的模擬實現(xiàn)一文里有)

總結(jié)

memcpy不能實現(xiàn)自己拷貝自己,也就是不適用于內(nèi)存疊加的情況。我們用memmove便可以解決這個問題。

對于memmove的模擬實現(xiàn),核心思想就是將會被覆蓋的、要被復制的內(nèi)容提前使用。這里分為兩種情況,一種是被復制的內(nèi)容地址在目標內(nèi)容地址的前面,另一種就是被復制的內(nèi)容地址在目標內(nèi)容地址的后面,對于前一種情況,我們使用由后至前進行復制的方法,對于后一種情況,我們使用由前至后進行復制的方法(dest在src后就由后向前。dest在src前,就由前向后)。

到此這篇關(guān)于C語言模擬實現(xiàn)memmove的示例代碼的文章就介紹到這了,更多相關(guān)C語言 memmove內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言之二叉樹的遍歷

    C語言之二叉樹的遍歷

    這篇文章主要介紹了C語言中二叉樹的遍歷:前序、中序、后序,認識二叉樹結(jié)構(gòu)最簡單的方式就是遍歷二叉樹,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • 利用簡潔的C語言代碼解決跳臺階問題與約瑟夫環(huán)問題

    利用簡潔的C語言代碼解決跳臺階問題與約瑟夫環(huán)問題

    這篇文章主要介紹了利用簡潔的C語言代碼解決跳臺階問題與約瑟夫環(huán)問題的方法,跳臺階問題與約瑟夫環(huán)問題是常見的基礎(chǔ)算法題目,需要的朋友可以參考下
    2016-02-02
  • C++中new和delete的使用方法詳解

    C++中new和delete的使用方法詳解

    這篇文章主要介紹了C++中new和delete的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C語言入門篇--學習選擇,if,switch語句以及代碼塊

    C語言入門篇--學習選擇,if,switch語句以及代碼塊

    本篇文章是基礎(chǔ)篇,適合c語言剛?cè)腴T的朋友,本文主要帶大家學習一下C語言的選擇,if,switch語句及代碼塊,幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C++從文本文件讀取數(shù)據(jù)到vector中的方法

    C++從文本文件讀取數(shù)據(jù)到vector中的方法

    這篇文章主要給大家介紹了利用C++如何從文本文件讀取數(shù)據(jù)到vector中,文章通過實例給出示例代碼,相信會對大家的理解和學習很有幫助,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • C++語法中的函數(shù)重載和默認參數(shù)

    C++語法中的函數(shù)重載和默認參數(shù)

    這篇文章主要介紹了C++語法中的函數(shù)重載和默認參數(shù),本文從語法角度通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • C語言函數(shù)多個返回值方式

    C語言函數(shù)多個返回值方式

    這篇文章主要介紹了C語言函數(shù)多個返回值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進行排序的實現(xiàn)過程探究

    C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進行排序的實現(xiàn)過程探究

    這篇文章主要介紹了C語言對結(jié)構(gòu)體數(shù)組按照某項規(guī)則進行排序的實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • qt中 painter 的用法及原理示例詳解

    qt中 painter 的用法及原理示例詳解

    QPainter是Qt的一個繪圖類,它的主要任務是在繪圖設(shè)備上進行2D圖形渲染,這篇文章主要介紹了qt中 painter 的用法以及原理,需要的朋友可以參考下
    2023-07-07
  • VSCode Linux的C++代碼格式化配置的實現(xiàn)

    VSCode Linux的C++代碼格式化配置的實現(xiàn)

    動格式化代碼容易出現(xiàn)錯誤,特別是當代碼量較大時,使用自動格式化可以減少這種錯誤的風險,本文主要介紹了VSCode Linux的C++代碼格式化配置的實現(xiàn),感興趣的可以了解一下
    2023-10-10

最新評論

濉溪县| 忻州市| 柞水县| 新巴尔虎左旗| 织金县| 富源县| 兴和县| 石家庄市| 丰台区| 汉阴县| 抚远县| 仁怀市| 南丹县| 福州市| 体育| 博乐市| 阜康市| 南京市| 江城| 仙桃市| 客服| 峨眉山市| 永济市| 寻乌县| 宜宾县| 盈江县| 无极县| 怀仁县| 静海县| 太谷县| 内丘县| 壶关县| 佛学| 万山特区| 论坛| 昭通市| 凤冈县| 洛浦县| 都匀市| 霍城县| 荥阳市|