void* my_memcpy(void*dst,const void*src ,size_t count) { assert(dst); assert(src); void* ret = dst; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return ret; }
memmove函數: memmve函數是為了避免memcpy函數出現的內存重疊(上篇提到過),而開發的新函數,思想就是,如果有內存重疊的情況,那我們從後向前拷貝,如果沒有,就如memcpy一樣,從前向後拷貝,實現代碼如下:
void* my_memmove(void*dst, const void*src, size_t count) { assert(dst); assert(src); void*ret = dst; if ((char*)dst > ((char*)src + count))//判斷是否內存重疊 { while (count--) { *((char*)dst + count) = *((char*)src + count); } } else { while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } } return ret; }
進行內存拷貝,比字符串拷貝要多傳遞一個拷貝偏移量的參數,因為字符串拷貝往往是遇到0就停止拷貝,而內存拷貝不存在此類問題,運用這兩類函數需要思考怎樣才能高效地讓程序運行。