內(nèi)存函數(shù)
memcpy內(nèi)存拷貝
- 函數(shù)memcpy從source的位置開始向后復(fù)制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
- 這個函數(shù)在遇到 ‘\0' 的時候并不會停下來。
- 如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。
原格式
分析
**字面上意思只要是內(nèi)存里面的東西就都可以進行拷貝,所以就打破了字符串拷貝的魔咒,什么類型都可以進行拷貝,那就不需要想來,肯定回和萬能類型(通用類型指針-無類型指針)void*有關(guān),因為當時做qsort還是印象深刻的
/*num是幾個字節(jié)的意思*/
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*無類型不好直接加加,就強轉(zhuǎn)char*再加加
((char*)src)++;
}
return ret;
}
內(nèi)存拷貝的問題
1.內(nèi)存相關(guān)連的話,就會拷貝錯誤
那你怎么解決內(nèi)存相關(guān)連還不會有上面的錯誤,正面賦值交集的內(nèi)存空間會被操作兩次,就會改變原來的值,那我們怎么做呢,如果從后面來呢,前面操作兩次會把后面的變了,那就先把后面的拿走賦值,不就間接的改變了原來會變的情況了嗎,所以這樣上面的代碼就得修改了,這是朝后面拷貝的情況,如果提目是朝前面拷貝的話,是不是從后面來就有問題了,反而從前面來會比較完美,所以我們得兩種情況都得考慮到
所以為了解決重疊拷貝的問題就有了memmove這個函數(shù)
2.內(nèi)存不夠了還要朝里面拷貝直接程序掛了
memmove內(nèi)存重疊拷貝
用來處理內(nèi)存重疊的情況
C語言規(guī)定
memcpy 只要處理內(nèi)存不重疊的拷貝就可以
memmove 處理重疊內(nèi)存拷貝
我們重寫memcpy的代碼是滿足C語言要求的,在vs這個編譯器中memcpy實際上是超額完成任務(wù)了,他的效果已經(jīng)和memmove效果一樣了
你會發(fā)現(xiàn)他們跑出來的效果 是一樣的,所以上面那個測試我就是用我自己的代碼測試的(已經(jīng)達到C語言的標準了)
我們再精細點就是memmove的內(nèi)容了
原格式
分析
/*num是幾個字節(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*,分成最小然后一個一個傳
*(char*)dest = *(char*)src;
((char*)dest)++;//void*無類型不好直接加加,就強轉(zhuǎn)char*再加加
((char*)src)++;
}
}
else
{
while (num--)
{
//sre內(nèi)存從后向前拷貝
//和void*連用char*,分成最小然后一個一個傳
*((char*)dest+num) = *((char*)src+num);
//((char*)dest)++;//void*無類型不好直接加加,就強轉(zhuǎn)char*再加加
//((char*)src)++;
}
}
return ret;
}
memset內(nèi)存設(shè)置
將緩沖區(qū)設(shè)置為指定的字符。
原格式
memcmp內(nèi)存比較
和strcmp相似,只不過一個是比較字符串,一個比較內(nèi)存,由于不知道什么類型,所以后面有字節(jié)個數(shù)限制,準確的說應(yīng)該和strncmp相似,因為后面都有一個個數(shù)的參數(shù)
原格式
分析
基本和字符串比較一樣,就是變成了內(nèi)存比較罷了
//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)//這個先減減就是細節(jié)
{
((char*)buf1)++;
((char*)buf2)++;
}
if (*(char*)buf1 - *(char*)buf2 > 0)
return 1;
if (*(char*)buf1 - *(char*)buf2 < 0)
return -1;
return 0;
}
給你count不要亂超,因為他操作的是內(nèi)存,沒有字符串補\0的功能
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注html5模板網(wǎng)的更多內(nèi)容!