深度解析三個常見的C語言內(nèi)存函數(shù)
1.memcpy函數(shù)(內(nèi)存拷貝函數(shù))
函數(shù)介紹
1.memcpy函數(shù)的作用:從source的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。 可以拷貝字符數(shù)組,整型數(shù)組,結構體等等,所以參數(shù)是void* 的指針;
2.這個函數(shù)在遇到 '\0' 的時候并不會停下來。(注意)
3.memcpy函數(shù)的局限:如果source和destination有任何的重疊,復制的結果都是未定義的。memcpy函數(shù)拷貝不重疊的內(nèi)存的拷貝。
4.拷貝結束,返回目標空間的起始地址。
使用舉例:
memcpy的模擬實現(xiàn):
void* memcpy(void* dst, const void* src, size_t count) { void* ret = dst; assert(dst); assert(src); while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return(ret); }
就是將源內(nèi)容一個一個字節(jié)的拷貝到目標空間去,所以強制類型轉換成char*;
2.memmove函數(shù)(內(nèi)存移動函數(shù))
函數(shù)介紹
memcpy和memmove函數(shù)的用法一樣;作用有所差別;
1.memmove函數(shù)不僅可以拷貝不重疊的內(nèi)存,而且可以拷貝重疊的內(nèi)存。
2.和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標內(nèi)存塊是可以重疊的。
3.如果源空間和目標空間出現(xiàn)重疊,就得使用memmove函數(shù)處理。
memmove的使用示例
當memmove函數(shù)用來拷貝重疊內(nèi)存
memmove函數(shù)的模擬實現(xiàn)
void* memmove(void* dst, const void* src, size_t count) { void* ret = dst; if (dst <= src || (char*)dst >= ((char*)src + count)) { while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } } else { dst = (char*)dst + count - 1; src = (char*)src + count - 1; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst - 1; src = (char*)src - 1; } } return(ret); }
解析:
例如
將arr[]={1,2,3,4,5,6,7,8,9,10}中的1 2 3 4 5 放到3 4 5 6 7的位置上去,如果我們還是用前面memcpy的思想
第一步:把1放到3上去,變?yōu)? 2 1 4 5 6 7 8 9 10
第二步:把2放到4上去,變?yōu)? 2 1 2 5 6 7 8 9 10
第三步:我們需要將3放到5上去,但是,第一步我們已經(jīng)將3改變了,所以這種思想不行;
memmove模擬實現(xiàn)思想:
3.memcmp函數(shù)(內(nèi)存比較函數(shù))
函數(shù)介紹
比較從ptr1和ptr2指針開始的num個字節(jié)
返回值如下:
使用示例代碼:
int main() { char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; int n; n = memcmp(buffer1, buffer2, sizeof(buffer1)); if (n > 0) { printf("'%s' is greater than '%s'.\n", buffer1, buffer2); } else if (n < 0) { printf("'%s' is less than '%s'.\n", buffer1, buffer2); } else { printf("'%s' is the same as '%s'.\n", buffer1, buffer2); } return 0; }
運行結果:
到此這篇關于深度解析三個常見的C語言內(nèi)存函數(shù)的文章就介紹到這了,更多相關C語言內(nèi)存函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- C語言的字符串函數(shù),內(nèi)存函數(shù)筆記詳解
- c語言重要的字符串與內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的使用及其模擬實現(xiàn)
- C語言詳解如何應用模擬字符串和內(nèi)存函數(shù)
- C語言超詳細講解字符串函數(shù)和內(nèi)存函數(shù)
- C語言深入詳解四大內(nèi)存函數(shù)的使用
- C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實現(xiàn)
- 深入了解C語言中的字符串和內(nèi)存函數(shù)
- C語言內(nèi)存函數(shù)的實現(xiàn)示例
- C語言內(nèi)存函數(shù)的具體使用
- C語言實現(xiàn)內(nèi)存函數(shù)的示例代碼
相關文章
C語言數(shù)據(jù)結構實現(xiàn)字符串分割的實例
這篇文章主要介紹了C語言數(shù)據(jù)結構實現(xiàn)字符串分割的實例的相關資料,希望通過本文能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10C語言執(zhí)行時,程序控制臺輸出窗口 一閃而過問題及解決
這篇文章主要介紹了C語言執(zhí)行時,程序控制臺輸出窗口 一閃而過問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11使用Objective-C獲取IPHONE手機IMSI序列號
這篇文章主要介紹了使用Objective-C獲取IPHONE手機IMSI序列號的方法以及通過IMSI序列號獲取運營商、手機號的方法,非常的實用,有需要的小伙伴可以參考下。2015-04-04