溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語言中內(nèi)存函數(shù)的示例分析

發(fā)布時(shí)間:2021-09-13 16:34:08 來源:億速云 閱讀:98 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)C語言中內(nèi)存函數(shù)的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

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

    memcpy內(nèi)存拷貝

    • 函數(shù)memcpy從source的位置開始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。

    • 這個(gè)函數(shù)在遇到 ‘\0' 的時(shí)候并不會(huì)停下來。

    • 如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。

    原格式

    C語言中內(nèi)存函數(shù)的示例分析

    分析

    **字面上意思只要是內(nèi)存里面的東西就都可以進(jìn)行拷貝,所以就打破了字符串拷貝的魔咒,什么類型都可以進(jìn)行拷貝,那就不需要想來,肯定回和萬能類型(通用類型指針-無類型指針)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*無類型不好直接加加,就強(qiáng)轉(zhuǎn)char*再加加
    		((char*)src)++;
    	}	
    	return ret;
    }
    內(nèi)存拷貝的問題

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

    C語言中內(nèi)存函數(shù)的示例分析

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

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

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

    C語言中內(nèi)存函數(shù)的示例分析

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

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

    C語言規(guī)定

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

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

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

    C語言中內(nèi)存函數(shù)的示例分析

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

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

    原格式

    C語言中內(nèi)存函數(shù)的示例分析

    分析

    C語言中內(nèi)存函數(shù)的示例分析

    C語言中內(nèi)存函數(shù)的示例分析

    C語言中內(nèi)存函數(shù)的示例分析

    C語言中內(nèi)存函數(shù)的示例分析

    /*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*無類型不好直接加加,就強(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*無類型不好直接加加,就強(qiáng)轉(zhuǎn)char*再加加
    			//((char*)src)++;
    		}
    	}	
    	return ret;
    }

    C語言中內(nèi)存函數(shù)的示例分析

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

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

    原格式

    C語言中內(nèi)存函數(shù)的示例分析

    memcmp內(nèi)存比較

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

    原格式

    C語言中內(nèi)存函數(shù)的示例分析

    分析

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

    C語言中內(nèi)存函數(shù)的示例分析

    C語言中內(nèi)存函數(shù)的示例分析

    //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)存,沒有字符串補(bǔ)\0的功能

    關(guān)于“C語言中內(nèi)存函數(shù)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI