C语言标准库函数memcpy和memmove的区别以及内存重叠问题处理

①memcpy()和memmove()都是C语言中的标准库函数,定义在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:

void *memcpy(void *dst, const void *src, size_t count);
void *memmove(void *dst, const void *src, size_t count);

他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。

②内存重叠有以下两种情况

③memcpy()和memmove()实现

void* memcpy(void* dst, const void* src, size_t n)
{
    char* dstPtr = (char*)dst;
    char* srcPtr = (char*)src;

    if((dstPtr != NULL) && (srcPtr != NULL) && (n > 0))
    {
        while(n--)
        {
            *dstPtr++ = *srcPtr++;
        }
    }

    return dst;  
}
void* memmove(void* dst, const void* src, size_t n)
{
    char* dstPtr = (char*)dst;
    char* srcPtr = (char*)src;
    
    if((dstPtr != NULL) && (srcPtr != NULL) && (n > 0))
    {
        if((srcPtr < dstPtr) && (dstPtr < (srcPtr + n)))
        {
            do
            {
                *(dstPtr + n - 1) = *(srcPtr + n - 1);
            }while(--n);
        }
        else
        {
            while(n--)
            {
                *dstPtr++ = *srcPtr++;
            }
        }
    }
    
    return dst;  
}
原文地址:https://www.cnblogs.com/wulei0630/p/8631206.html