zoukankan      html  css  js  c++  java
  • 自己实现的库函数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 = '';
    return dest;
    }
    
    
  • 相关阅读:
    把旧表中数据加入到新表中
    mysql字段-创建时间与更新时间
    springboot-maven依赖源
    刚刚下载的IDEA打不开
    matplotlib-实战01
    实战1-数据清理
    python函数(三)
    交换机配置DHCP中继
    python函数(二)
    用事实说话
  • 原文地址:https://www.cnblogs.com/guochuanrui/p/5374826.html
Copyright © 2011-2022 走看看