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

C語(yǔ)言的編程之美之內(nèi)存函數(shù)

 更新時(shí)間:2021年09月13日 15:46:18   作者:小碼農(nóng)UU  
這篇文章主要介紹了C語(yǔ)言全部?jī)?nèi)存操作函數(shù)的實(shí)現(xiàn)詳細(xì)講解,作者用圖文代碼實(shí)例講解的很清晰,有感興趣的同學(xué)可以研究下

內(nèi)存函數(shù)

memcpy內(nèi)存拷貝

  • 函數(shù)memcpy從source的位置開(kāi)始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
  • 這個(gè)函數(shù)在遇到 ‘\0' 的時(shí)候并不會(huì)停下來(lái)。
  • 如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。

原格式

image-20210912150415470

分析

**字面上意思只要是內(nèi)存里面的東西就都可以進(jìn)行拷貝,所以就打破了字符串拷貝的魔咒,什么類型都可以進(jìn)行拷貝,那就不需要想來(lái),肯定回和萬(wàn)能類型(通用類型指針-無(wú)類型指針)void*有關(guān),因?yàn)楫?dāng)時(shí)做qsort還是印象深刻的

/*num是幾個(gè)字節(jié)的意思*/
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		//和void*連用char*,分成最小然后一個(gè)一個(gè)傳
		*(char*)dest = *(char*)src;
		((char*)dest)++;//void*無(wú)類型不好直接加加,就強(qiáng)轉(zhuǎn)char*再加加
		((char*)src)++;
	}	
	return ret;
}

內(nèi)存拷貝的問(wèn)題

1.內(nèi)存相關(guān)連的話,就會(huì)拷貝錯(cuò)誤

image-20210912174618496

那你怎么解決內(nèi)存相關(guān)連還不會(huì)有上面的錯(cuò)誤,正面賦值交集的內(nèi)存空間會(huì)被操作兩次,就會(huì)改變?cè)瓉?lái)的值,那我們?cè)趺醋瞿?,如果從后面?lái)呢,前面操作兩次會(huì)把后面的變了,那就先把后面的拿走賦值,不就間接的改變了原來(lái)會(huì)變的情況了嗎,所以這樣上面的代碼就得修改了,這是朝后面拷貝的情況,如果提目是朝前面拷貝的話,是不是從后面來(lái)就有問(wèn)題了,反而從前面來(lái)會(huì)比較完美,所以我們得兩種情況都得考慮到

所以為了解決重疊拷貝的問(wèn)題就有了memmove這個(gè)函數(shù)

2.內(nèi)存不夠了還要朝里面拷貝直接程序掛了

image-20210912175703527

memmove內(nèi)存重疊拷貝

用來(lái)處理內(nèi)存重疊的情況

C語(yǔ)言規(guī)定

memcpy 只要處理內(nèi)存不重疊的拷貝就可以

memmove 處理重疊內(nèi)存拷貝

我們重寫memcpy的代碼是滿足C語(yǔ)言要求的,在vs這個(gè)編譯器中memcpy實(shí)際上是超額完成任務(wù)了,他的效果已經(jīng)和memmove效果一樣了

image-20210912201352859

你會(huì)發(fā)現(xiàn)他們跑出來(lái)的效果 是一樣的,所以上面那個(gè)測(cè)試我就是用我自己的代碼測(cè)試的(已經(jīng)達(dá)到C語(yǔ)言的標(biāo)準(zhǔn)了)

我們?cè)倬?xì)點(diǎn)就是memmove的內(nèi)容了

原格式

image-20210912195704561

分析

image-20210912200345318

image-20210912210111460

image-20210912210718304

image-20210912212544483

/*num是幾個(gè)字節(jié)的意思*/
void* my_memmove(void* dest,const void* src, size_t num)//memmove和memcpy的參數(shù)是一樣的
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			//sre內(nèi)存從前向后拷貝
			//和void*連用char*,分成最小然后一個(gè)一個(gè)傳
			*(char*)dest = *(char*)src;
			((char*)dest)++;//void*無(wú)類型不好直接加加,就強(qiáng)轉(zhuǎn)char*再加加
			((char*)src)++;
		}
	}
	else
	{
		while (num--)
		{
			//sre內(nèi)存從后向前拷貝
			//和void*連用char*,分成最小然后一個(gè)一個(gè)傳
			*((char*)dest+num) = *((char*)src+num);
			//((char*)dest)++;//void*無(wú)類型不好直接加加,就強(qiáng)轉(zhuǎn)char*再加加
			//((char*)src)++;
		}
	}	
	return ret;
}

image-20210912215713723

memset內(nèi)存設(shè)置

將緩沖區(qū)設(shè)置為指定的字符。

原格式

image-20210912224129279

memcmp內(nèi)存比較

和strcmp相似,只不過(guò)一個(gè)是比較字符串,一個(gè)比較內(nèi)存,由于不知道什么類型,所以后面有字節(jié)個(gè)數(shù)限制,準(zhǔn)確的說(shuō)應(yīng)該和strncmp相似,因?yàn)楹竺娑加幸粋€(gè)個(gè)數(shù)的參數(shù)

原格式

image-20210912222610487

分析

基本和字符串比較一樣,就是變成了內(nèi)存比較罷了

image-20210912233051911

image-20210912233234287

//buf1內(nèi)存里的內(nèi)容比buf2內(nèi)存里的內(nèi)容大就>0,反之<0
int my_memcmp(const void* buf1, const void* buf2, size_t count)
{
	assert(buf1 && buf2);
	while (--count && *(char*)buf1 == *(char*)buf2)//這個(gè)先減減就是細(xì)節(jié)
	{
		((char*)buf1)++;
		((char*)buf2)++;
	}
	if (*(char*)buf1 - *(char*)buf2 > 0)
		return 1;
	if (*(char*)buf1 - *(char*)buf2 < 0)
		return -1;
	return 0;
}

給你count不要亂超,因?yàn)樗僮鞯氖莾?nèi)存,沒(méi)有字符串補(bǔ)\0的功能

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    Qt+OpenCV利用幀差法實(shí)現(xiàn)車輛識(shí)別

    所謂幀差法也就是對(duì)連續(xù)圖像幀做差分運(yùn)算,其結(jié)果與定義好的閾值比較,若大于閾值則為運(yùn)動(dòng)目標(biāo)值為1,否則值為0?。本文將利用幀差法實(shí)現(xiàn)車輛識(shí)別,感興趣的可以了解一下
    2022-08-08
  • C語(yǔ)言快速實(shí)現(xiàn)掃雷小游戲

    C語(yǔ)言快速實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++ string 字符串查找匹配實(shí)例代碼

    C++ string 字符串查找匹配實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇C++ string 字符串查找匹配實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • vscode調(diào)試使用make編譯的項(xiàng)目

    vscode調(diào)試使用make編譯的項(xiàng)目

    VSCode本身是一個(gè)代碼編輯器,自帶的編譯功能比較弱,本文主要介紹了vscode調(diào)試使用make編譯的項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C語(yǔ)言實(shí)現(xiàn)刮刮樂(lè)效果是示例代碼

    C語(yǔ)言實(shí)現(xiàn)刮刮樂(lè)效果是示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何C語(yǔ)言模擬實(shí)現(xiàn)刮刮樂(lè)的效果,只要按下鼠標(biāo)左鍵并移動(dòng)就可以刮開(kāi)刮卡層,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • C/C++中常用加密與解密算法的實(shí)現(xiàn)

    C/C++中常用加密與解密算法的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了一些在C++中常用的加密與解密算法,這其中包括Xor異或、BASE64、AES、MD5、SHA256、RSA等,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-11-11
  • OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度

    這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時(shí),opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-09-09
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C/C++?函數(shù)的存儲(chǔ)位置和占用空間詳解

    C/C++?函數(shù)的存儲(chǔ)位置和占用空間詳解

    Lambda函數(shù)的代碼部分在代碼段中,被捕獲的變量存儲(chǔ)在Lambda函數(shù)對(duì)象的內(nèi)部,這些變量的存儲(chǔ)位置取決于Lambda函數(shù)對(duì)象的存儲(chǔ)位置,這篇文章主要介紹了C/C++函數(shù)的存儲(chǔ)位置和占用空間,需要的朋友可以參考下
    2023-06-06
  • C++實(shí)現(xiàn)STL迭代器萃取的示例代碼

    C++實(shí)現(xiàn)STL迭代器萃取的示例代碼

    迭代器是一種抽象的設(shè)計(jì)概念,它提供了一種方法,使之能夠依序巡訪某個(gè)聚合物(容器)所含的各個(gè)元素,而又無(wú)需暴露該聚合物的內(nèi)部表述方式。本文主要介了STL迭代器萃取的方法,需要的可以參考一下
    2022-11-11

最新評(píng)論

中江县| 丰城市| 宿州市| 齐河县| 永清县| 清丰县| 英山县| 福贡县| 浮山县| 高淳县| 通州市| 化德县| 山阴县| 澳门| 漳浦县| 城步| 临潭县| 栾城县| 长治县| 宽甸| 甘泉县| 佛冈县| 唐河县| 大丰市| 通州区| 广安市| 泗水县| 唐海县| 仪陇县| 阳城县| 彭泽县| 涿鹿县| 宁明县| 怀安县| 安陆市| 宁蒗| 沭阳县| 云安县| 汉阴县| 平和县| 贺州市|