C語(yǔ)言的編程之美之內(nèi)存函數(shù)
內(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é)果都是未定義的。
原格式
分析
**字面上意思只要是內(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ò)誤
那你怎么解決內(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)存不夠了還要朝里面拷貝直接程序掛了
memmove內(nèi)存重疊拷貝
用來(lái)處理內(nèi)存重疊的情況
C語(yǔ)言規(guī)定
memcpy 只要處理內(nèi)存不重疊的拷貝就可以
memmove 處理重疊內(nèi)存拷貝
我們重寫(xiě)memcpy的代碼是滿足C語(yǔ)言要求的,在vs這個(gè)編譯器中memcpy實(shí)際上是超額完成任務(wù)了,他的效果已經(jīng)和memmove效果一樣了
你會(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)容了
原格式
分析
/*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; }
memset內(nèi)存設(shè)置
將緩沖區(qū)設(shè)置為指定的字符。
原格式
memcmp內(nèi)存比較
和strcmp相似,只不過(guò)一個(gè)是比較字符串,一個(gè)比較內(nèi)存,由于不知道什么類型,所以后面有字節(jié)個(gè)數(shù)限制,準(zhǔn)確的說(shuō)應(yīng)該和strncmp相似,因?yàn)楹竺娑加幸粋€(gè)個(gè)數(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)//這個(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)容!
- 深度解析三個(gè)常見(jiàn)的C語(yǔ)言內(nèi)存函數(shù)
- 深入了解C語(yǔ)言中的字符串和內(nèi)存函數(shù)
- C語(yǔ)言深入詳解四大內(nèi)存函數(shù)的使用
- C語(yǔ)言超詳細(xì)講解字符串函數(shù)和內(nèi)存函數(shù)
- C語(yǔ)言字符串函數(shù)與內(nèi)存函數(shù)精講
- C語(yǔ)言內(nèi)存函數(shù)的使用及其模擬實(shí)現(xiàn)
- C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)詳解
- C語(yǔ)言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- C語(yǔ)言進(jìn)階教程之字符串&內(nèi)存函數(shù)
- C語(yǔ)言內(nèi)存函數(shù)的實(shí)現(xiàn)示例
相關(guān)文章
Qt實(shí)現(xiàn)導(dǎo)出QTableWidget/QTableView數(shù)據(jù)
這篇文章主要介紹了在Qt中實(shí)現(xiàn)將QTableWidget或者QTableView中的數(shù)據(jù)直接導(dǎo)出的示例代碼,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-01-01C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼
這篇文章主要介紹了C++ 設(shè)置和獲取當(dāng)前工作路徑的實(shí)現(xiàn)代碼,防止DLL加載不到配置和文件,需要的朋友可以參考下2017-09-09C語(yǔ)言算法練習(xí)之?dāng)?shù)組求素?cái)?shù)
這篇文章主要為大家介紹了C語(yǔ)言算法練習(xí)中數(shù)組求素?cái)?shù)的實(shí)現(xiàn)方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下2022-09-09C++實(shí)現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項(xiàng))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(83.移除有序鏈表中的重復(fù)項(xiàng)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07通過(guò)c++的sort函數(shù)實(shí)現(xiàn)成績(jī)排序功能
這篇文章主要介紹了通過(guò)c++的sort函數(shù)實(shí)現(xiàn)成績(jī)排序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)
這篇文章主要介紹了IOS 開(kāi)發(fā)UITextView回收或關(guān)閉鍵盤(pán)的相關(guān)資料,需要的朋友可以參考下2017-06-06