欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

例子

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

用memcpy嘗試

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

錯(cuò)誤原因

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

memcpy實(shí)現(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;
} 

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

用memmove嘗試

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

memmove的模擬實(shí)現(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的返回值是目標(biāo)地址,形勢(shì)參數(shù)分別是(目標(biāo)地址,源頭地址,需要操作的字節(jié)數(shù))

具體實(shí)現(xiàn)步驟

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

由上面的錯(cuò)誤分析,我們知道是因?yàn)楹竺嬉粡?fù)制過去的內(nèi)容被更改了,還是用上面的例子做示范,我們從1開始復(fù)制的話,1會(huì)將3覆蓋掉,進(jìn)而導(dǎo)致想將3復(fù)制到到5的位置上時(shí),實(shí)際上是將1復(fù)制到5的位置上。

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

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

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

我們想將指針前移,直接count減一就行,又因?yàn)槲覀円貜?fù)這一行為,所以我們使用while循環(huán)來實(shí)現(xiàn)。

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

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

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

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

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

錯(cuò)誤原因

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

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

總結(jié)

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

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

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

相關(guān)文章

  • C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法

    C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)當(dāng)前時(shí)間動(dòng)態(tài)顯示的方法,涉及C++時(shí)間操作及Sleep方法的使用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • c語言實(shí)現(xiàn)的帶通配符匹配算法

    c語言實(shí)現(xiàn)的帶通配符匹配算法

    這篇文章主要介紹了c語言實(shí)現(xiàn)的帶通配符匹配算法,需要的朋友可以參考下
    2015-03-03
  • C++?opencv將圖片動(dòng)漫化介紹

    C++?opencv將圖片動(dòng)漫化介紹

    大家好,本篇文章主要講的是C++?opencv將圖片動(dòng)漫化介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語言淺析函數(shù)的用法

    C語言淺析函數(shù)的用法

    C語言函數(shù)是用來模塊化構(gòu)建程序的。如果你的功能少,你可以全都寫在mian函數(shù)中,但是當(dāng)實(shí)現(xiàn)功能多的時(shí)候,如果全寫在main的函數(shù)里,不僅代碼不美觀,而且函數(shù)實(shí)現(xiàn)的時(shí)候結(jié)構(gòu)復(fù)雜,代碼重復(fù)
    2022-07-07
  • 利用C語言實(shí)現(xiàn)三子棋游戲

    利用C語言實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了利用C語言實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • C語言小程序 計(jì)算第二天日期示例代碼

    C語言小程序 計(jì)算第二天日期示例代碼

    輸入一個(gè)日期,判斷下一個(gè)日期是哪一天,如果日期輸入錯(cuò)誤,則調(diào)用Linux下的cal命令顯示輸入的月份
    2013-07-07
  • C語言哈希表概念超詳細(xì)講解

    C語言哈希表概念超詳細(xì)講解

    哈希是一種很高效的存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),它是利用的一種映射關(guān)系,它也是STL中unordered_map和unordered_set?的底層結(jié)構(gòu)。本文,主要講解哈希的原理,哈希的實(shí)現(xiàn),里面關(guān)鍵點(diǎn)在于如何解決哈希沖突
    2023-02-02
  • Opencv實(shí)現(xiàn)對(duì)象提取與測(cè)量

    Opencv實(shí)現(xiàn)對(duì)象提取與測(cè)量

    這篇文章主要為大家詳細(xì)介紹了基于Opencv實(shí)現(xiàn)對(duì)象提取與測(cè)量,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 淺談c++ vector和map的遍歷和刪除對(duì)象

    淺談c++ vector和map的遍歷和刪除對(duì)象

    下面小編就為大家?guī)硪黄獪\談c++ vector和map的遍歷和刪除對(duì)象。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++中 set的用法

    C++中 set的用法

    這篇文章主要介紹了C++中 set的用法,set的內(nèi)部使用了紅黑樹對(duì)所有的元素進(jìn)行了排序。在樹結(jié)構(gòu)當(dāng)中,我們通常使用的都是<key, value>的形式。下面我們來看看該內(nèi)容的具體情況,需要的朋友也可以參考一下
    2021-11-11

最新評(píng)論