自己实现的内存处理函数

1、void* memcpy(void*dst,void const *src,size_t length)

从src的起始位置起复制length个字节到dst的内存起始位置,如果src和dst以任何形式出现重叠,结果未定义。

void* my_memcpy(void *dest, void const *src, size_t length)
{
    assert(dest!= NULL&&src != NULL);
    char *pdest = (char*)dest;
    const char *psrc = (char*)src;
    while (length--)
    {
        *pdest++ = *psrc++;
    }
    return dest;
}

2、void* memmove(void*dst,void const *src,size_t length)

从src的起始位置起复制length个字节到dst内存起始的位置,如果源和目标参数可能存在重叠,应使用mommove。

void* my_memmove(void *dest, void const *src, size_t length)
{
    assert(dest != NULL&&src != NULL);
    char *pdest = (char*)dest;
    const char *psrc = (char*)src;
    if (psrc + length <= pdest || src >= pdest)//可以正常赋值
    {
        while (length--)
        {
            *pdest++ = *psrc++;
        }
    }
    else//不能从前往后的赋值,有重叠的情况
    {
        while (length-- )
        {
            *(pdest + length) = *(psrc + length);
        }
    }
    *pdest = '';
    
    return dest;
}

3、void* memcpy(void*dst,void const *src,size_t length)

注意:因为按照无符号字符逐字节进行比较,如果不用于单字节比较的数据如(int,float),会出现意料之外的结果

int my_memcmp(void* src1, void* src2, int length)
{
    assert(src1 != NULL && src2 != NULL);
    const char* pSrc1 = (char*)src1;
    const char* pSrc2 = (char*)src2;
    while (length-- > 0)
    {
        if (*pSrc1++ != *pSrc2++)   
        {
            return *pSrc1 < *pSrc2 ? -1 : 1;
        }
    }
    return 0;  
}

4、void* memset(void*dst,int ch,size_t length)

void* my_memset(void* dest, int ch, size_t length)
{
    assert(dest != NULL);
    char* pDest = (char*)dest;
    while (length--)   
    {
        *pDest++ = c;
    }
    return dest;    
}
原文地址:https://www.cnblogs.com/Blog-day/p/My_Blog_Days_33.html