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;
    }
    
    
  • 相关阅读:
    Android Studio 开发
    Jsp编写的页面如何适应手机浏览器页面
    电影
    Oracle 拆分列为多行 Splitting string into multiple rows in Oracle
    sql server 2008 自动备份
    WINGIDE 激活失败
    python安装 错误 “User installations are disabled via policy on the machine”
    ble编程-外设发送数据到中心
    iOS开发-NSString去掉所有换行及空格
    ios9 字符串与UTF-8 互相转换
  • 原文地址:https://www.cnblogs.com/guochuanrui/p/5374826.html
Copyright © 2011-2022 走看看