C語言的編程之美之內存函數
內存函數
memcpy內存拷貝
- 函數memcpy從source的位置開始向後復制num個字節的數據到destination的內存位置。
- 這個函數在遇到 ‘\0′ 的時候並不會停下來。
- 如果source和destination有任何的重疊,復制的結果都是未定義的。
原格式
分析
**字面上意思隻要是內存裡面的東西就都可以進行拷貝,所以就打破瞭字符串拷貝的魔咒,什麼類型都可以進行拷貝,那就不需要想來,肯定回和萬能類型(通用類型指針-無類型指針)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.內存相關連的話,就會拷貝錯誤
那你怎麼解決內存相關連還不會有上面的錯誤,正面賦值交集的內存空間會被操作兩次,就會改變原來的值,那我們怎麼做呢,如果從後面來呢,前面操作兩次會把後面的變瞭,那就先把後面的拿走賦值,不就間接的改變瞭原來會變的情況瞭嗎,所以這樣上面的代碼就得修改瞭,這是朝後面拷貝的情況,如果提目是朝前面拷貝的話,是不是從後面來就有問題瞭,反而從前面來會比較完美,所以我們得兩種情況都得考慮到
所以為瞭解決重疊拷貝的問題就有瞭memmove這個函數
2.內存不夠瞭還要朝裡面拷貝直接程序掛瞭
memmove內存重疊拷貝
用來處理內存重疊的情況
C語言規定
memcpy 隻要處理內存不重疊的拷貝就可以
memmove 處理重疊內存拷貝
我們重寫memcpy的代碼是滿足C語言要求的,在vs這個編譯器中memcpy實際上是超額完成任務瞭,他的效果已經和memmove效果一樣瞭
你會發現他們跑出來的效果 是一樣的,所以上面那個測試我就是用我自己的代碼測試的(已經達到C語言的標準瞭)
我們再精細點就是memmove的內容瞭
原格式
分析
/*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; }
memset內存設置
將緩沖區設置為指定的字符。
原格式
memcmp內存比較
和strcmp相似,隻不過一個是比較字符串,一個比較內存,由於不知道什麼類型,所以後面有字節個數限制,準確的說應該和strncmp相似,因為後面都有一個個數的參數
原格式
分析
基本和字符串比較一樣,就是變成瞭內存比較罷瞭
//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的功能
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!