自己實現的庫函數(memset,memcmp,memcpy,memmove)

 自己實現的庫函數2(memset,memcmp,memcpy,memmove)
memset,memcmp,memcpy,memmove是對內存進行管理的庫函數,爲了更好的理解和使用這幾個函數,自己用C語言實現一下~

//內存設置函數
void* my_memset(void* dest, int c, size_t count)
{
assert(dest != NULL);
char* pDest = (char*)dest;
while (count-->0)    //將內存中count個設置爲c
{
*pDest++ = c;
}
return dest;
}
//內存比較函數
int my_memcmp(void* src1, void* src2, int len)
{
assert(src1 != NULL && src2 != NULL);
const char* pSrc1 = (char*)src1;
const char* pSrc2 = (char*)src2;
while (len-- > 0)
{
if (*pSrc1++ != *pSrc2++)   //當內存中的數據不相等時,可以比較出大小,否則兩指針繼續向後指
{
return *pSrc1 < *pSrc2 ? -1 : 1;
}
}
return 0;  //相等則返回0
}

要重點說一下內坤拷貝和內存移動函數。。。
memmove與memcpy都是將count個字節的源內存地址的內容拷貝到目標內存地址中,但當源內存和目的內存存在重疊時,memcpy會出現錯誤!memmove能正確拷貝,但也增加了一點點開銷。
//內存拷貝函數
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (const char*)src;
while (count-- > 0)
{
*pDest++ = *pSrc++; //將pSrc指向的數據複製count個給pDest
}
return dest;
}
//內存移動函數
void* my_memmove(void* dest, void* src, size_t count)
{
assert(dest != NULL && src != NULL);
char* pDest = (char*)dest;
const char* pSrc = (char*)src;
     if (pSrc >= pDest || pDest >= (pSrc + count))//當源內存地址在目的內存地址之後或者目的地址在源內存地址+count之後,可以正常拷貝
{


          while (count-- > 0)
{
*pDest++ = *pSrc;
}
}
else     //否則需要從後覆蓋往前拷貝,防止出現覆蓋
    {
while (count-- > 0)



{
*(pDest + count) = *(pSrc + count);
}
}
*pDest = '\0';
return dest;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章