您的位置:首页 > 编程语言 > C语言/C++

自己实现的库函数(memset,memcmp,memcpy,memmove)

2017-04-16 11:49 423 查看
 自己实现的库函数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;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息