溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中內存函數的示例分析

發布時間:2021-09-13 16:34:08 來源:億速云 閱讀:130 作者:小新 欄目:開發技術

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

    內存函數

    memcpy內存拷貝

    • 函數memcpy從source的位置開始向后復制num個字節的數據到destination的內存位置。

    • 這個函數在遇到 ‘\0' 的時候并不會停下來。

    • 如果source和destination有任何的重疊,復制的結果都是未定義的。

    原格式

    C語言中內存函數的示例分析

    分析

    **字面上意思只要是內存里面的東西就都可以進行拷貝,所以就打破了字符串拷貝的魔咒,什么類型都可以進行拷貝,那就不需要想來,肯定回和萬能類型(通用類型指針-無類型指針)void*有關,因為當時做qsort還是印象深刻的

    /*num是幾個字節的意思*/
    void* my_memcpy(void* dest, const void* src, size_t num)
    {
    	assert(dest && src);
    	void* ret = dest;
    	while (num--)
    	{
    		//和void*連用char*,分成最小然后一個一個傳
    		*(char*)dest = *(char*)src;
    		((char*)dest)++;//void*無類型不好直接加加,就強轉char*再加加
    		((char*)src)++;
    	}	
    	return ret;
    }
    內存拷貝的問題

    1.內存相關連的話,就會拷貝錯誤

    C語言中內存函數的示例分析

    那你怎么解決內存相關連還不會有上面的錯誤,正面賦值交集的內存空間會被操作兩次,就會改變原來的值,那我們怎么做呢,如果從后面來呢,前面操作兩次會把后面的變了,那就先把后面的拿走賦值,不就間接的改變了原來會變的情況了嗎,所以這樣上面的代碼就得修改了,這是朝后面拷貝的情況,如果提目是朝前面拷貝的話,是不是從后面來就有問題了,反而從前面來會比較完美,所以我們得兩種情況都得考慮到

    所以為了解決重疊拷貝的問題就有了memmove這個函數

    2.內存不夠了還要朝里面拷貝直接程序掛了

    C語言中內存函數的示例分析

    memmove內存重疊拷貝

    用來處理內存重疊的情況

    C語言規定

    memcpy 只要處理內存不重疊的拷貝就可以

    memmove 處理重疊內存拷貝

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

    C語言中內存函數的示例分析

    你會發現他們跑出來的效果 是一樣的,所以上面那個測試我就是用我自己的代碼測試的(已經達到C語言的標準了)

    我們再精細點就是memmove的內容了

    原格式

    C語言中內存函數的示例分析

    分析

    C語言中內存函數的示例分析

    C語言中內存函數的示例分析

    C語言中內存函數的示例分析

    C語言中內存函數的示例分析

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

    C語言中內存函數的示例分析

    memset內存設置

    將緩沖區設置為指定的字符。

    原格式

    C語言中內存函數的示例分析

    memcmp內存比較

    和strcmp相似,只不過一個是比較字符串,一個比較內存,由于不知道什么類型,所以后面有字節個數限制,準確的說應該和strncmp相似,因為后面都有一個個數的參數

    原格式

    C語言中內存函數的示例分析

    分析

    基本和字符串比較一樣,就是變成了內存比較罷了

    C語言中內存函數的示例分析

    C語言中內存函數的示例分析

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

    給你count不要亂超,因為他操作的是內存,沒有字符串補\0的功能

    關于“C語言中內存函數的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女