代码改变世界

内存区域重叠

2009-08-30 17:59  Iron  阅读(679)  评论(0编辑  收藏  举报

这两天在准备面试,所以有些精妙的问题关注的比较多。在c/c++里面有个函数叫memcpy是内存拷贝用的,实际上是字符串的拷贝,程序说简单可以在一分钟内搞定,可是有个问题便是内存的重叠问题,一旦两个数组有重叠(这里不讨论如何会出现这种情况),普通的一个for循环可能会有重复数据的出现,而使函数结果错误。正确的程序如下:

void *MyMemCopy(void *dest,const void *src,size_t count)

{

    char *pDest=static_cast<char *>(dest);

    const char *pSrc=static_cast<const char *>(src);

/*首先判断目标数组起始位置是否在原数组的首地址和最后一个元素地址之间,如果是,则从后往前逐个复制,如果是其他情况则执行从前往后复制。

读者可自己画出几种情况的内存图来分析,可发现,这样做可以保证正确无误的复制(当然前提是目标数组要不小于原数组)*/

    if( pDest>pSrc && pDest<pSrc+count )

    {

        for(size_t i=count-1; i<=0; ++i)

        {

            pDest[i]=pSrc[i];

        }

    }

    else

    {

        for(size_t i=0; i<count; ++i) { pDest[i]=pSrc[i];

        }

    }

    return pDest;

}