天天看點

C語言模拟實作memcpy,memmove函數

    這裡memcpy與memmove函數的模拟實作,需要用到空指針來傳遞參數,之後強制類型轉換為char型,用size_t這個宏接受偏移量進行偏移,模拟實作如下:

    memcpy函數:

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就停止拷貝,而記憶體拷貝不存在此類問題,運用這兩類函數需要思考怎樣才能高效地讓程式運作。

    如有不足,希望批評指正。

轉載于:https://blog.51cto.com/10743407/1714495