您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)C語言中內(nèi)存函數(shù)的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
函數(shù)memcpy從source的位置開始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
這個(gè)函數(shù)在遇到 ‘\0' 的時(shí)候并不會(huì)停下來。
如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。
**字面上意思只要是內(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; }
1.內(nèi)存相關(guān)連的話,就會(huì)拷貝錯(cuò)誤
那你怎么解決內(nèi)存相關(guān)連還不會(huì)有上面的錯(cuò)誤,正面賦值交集的內(nèi)存空間會(huì)被操作兩次,就會(huì)改變?cè)瓉淼闹担俏覀冊(cè)趺醋瞿?,如果從后面來呢,前面操作兩次?huì)把后面的變了,那就先把后面的拿走賦值,不就間接的改變了原來會(huì)變的情況了嗎,所以這樣上面的代碼就得修改了,這是朝后面拷貝的情況,如果提目是朝前面拷貝的話,是不是從后面來就有問題了,反而從前面來會(huì)比較完美,所以我們得兩種情況都得考慮到
所以為了解決重疊拷貝的問題就有了memmove這個(gè)函數(shù)
2.內(nèi)存不夠了還要朝里面拷貝直接程序掛了
用來處理內(nèi)存重疊的情況
memcpy 只要處理內(nèi)存不重疊的拷貝就可以
memmove 處理重疊內(nèi)存拷貝
我們重寫memcpy的代碼是滿足C語言要求的,在vs這個(gè)編譯器中memcpy實(shí)際上是超額完成任務(wù)了,他的效果已經(jīng)和memmove效果一樣了
你會(huì)發(fā)現(xiàn)他們跑出來的效果 是一樣的,所以上面那個(gè)測(cè)試我就是用我自己的代碼測(cè)試的(已經(jīng)達(dá)到C語言的標(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*無類型不好直接加加,就強(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; }
將緩沖區(qū)設(shè)置為指定的字符。
和strcmp相似,只不過一個(gè)是比較字符串,一個(gè)比較內(nèi)存,由于不知道什么類型,所以后面有字節(jié)個(gè)數(shù)限制,準(zhǔn)確的說應(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)存,沒有字符串補(bǔ)\0的功能
關(guān)于“C語言中內(nèi)存函數(shù)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(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)容。