memcpy/memmove实现

对于memcpy(void dest, const void src, size_t count),其实现机制是将src强制转换为char *类型,然后拷贝src中的count个字节拷贝至dest中,跟strcpy不同的是,memcpy函数在末尾是不会加''的。

memmove(void dest, const void src, size_t count)与memcpy的根本区别在于,memcpy是不会考虑内存重叠的问题的,因此,memmove比memcpy更安全。

代码如下:

memcpy/memmove实现memcpy/memmove实现View Code

#include<iostream>
using namespace std;

//不考虑内存重叠,参考crt实现
/*
void *_memcpy(void *dest, const void *src, size_t count)
{
    void *pAddress = dest;
    if((dest == NULL) || (src == NULL) || (count < 0))
        return 0;
    while(count--)
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest+1;
        src  = (char *)src+1;
    }
    return pAddress;
}
*/

void *_memcpy(void *dest, const void *src, size_t count)
{
    void *pAddress = dest;
    const char *pSrc =  static_cast<const char *>(src);
    char *pDest =  static_cast<char *>(dest);
    if((dest == NULL) || (src == NULL) || (count < 0))
        return 0;
    while(count--)
    {
        *pDest++ = *pSrc++;
    }
    return pAddress;
}

//考虑内存重叠
void *_memmove(void *dest, const void *src, size_t count)
{
    void *pAddress = dest;
    const char *pSrc =  static_cast<const char *>(src);
    char *pDest =  static_cast<char *>(dest);
    //从后往前复制,避免重叠部分在复制之前被覆盖
    //保证重叠区域在被覆盖之前复制到目的区域中
    //与大端小端无关
    if(pDest >= pSrc || pDest <= pSrc+count-1)
    {
        pDest += count-1;
        pSrc  += count-1;
        while(count--)
        {
            *pDest-- = *pSrc--;
        }
    }
    else
    {
        while(count--)
        {
            *pDest++ = *pSrc++;
        }
    }
    return pAddress;
}

int main()
{
    char arr1[] = "12345";
    char arr2[20] = "abcdefghij";
    //int arr_1 = 1234;
    //int arr_2 = 4321;
    //_memcpy(&arr1, &arr2, 4);
    _memmove(arr2+2, arr2, 3);
    cout<<arr2<<endl;
    return 0;
}

原文链接: https://www.cnblogs.com/nanlou/archive/2012/10/08/2715802.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/65151

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:42
下一篇 2023年2月9日 上午11:42

相关推荐