补充下面函数代码:
如果两段内存重叠,用memcpy函数可能会导致行为未定义。 而memmove函数能够避免这种问题,下面是一种实现方式,请补充代码。
如果两段内存重叠,用memcpy函数可能会导致行为未定义。 而memmove函数能够避免这种问题,下面是一种实现方式,请补充代码。
#include <iostream>
using namespace std;
void* memmove(void* str1,const void* str2,size_t n)
{
char* pStr1= (char*) str1;
const char* pStr2=(const char*)str2;
if ( ) {
for(size_t i=0;i!=n;++i){
*(pStr1++)=*(pStr2++);
}
}
else{
pStr1+=n-1;
pStr2+=n-1;
for(size_t i=0;i!=n;++i){
*(pStr1--)=*(pStr2--);
}
}
return ( );
}
正确答案: A 你的答案: D (错误)
pStr1< pStr2 str1
pStr1+n < pStr2 str2
pStr1+n < pStr2 || pStr2+n<pStr1 str2
pStr2+n<pStr1 str1
黑色曲线表示错误的拷贝方式,红色的曲线表示正确的拷贝方式。
黑色方块表示的是二者内存覆盖的区域
与 pstr*+n 没有关系
第一中选择分支对应的是图 1 中红色曲线的拷贝方式 (方向: pstr2 -> pstr1)
第二中选择分支 else ... 对应的是图 2 中红色曲线的拷贝方式
方向是 pstr2 -> pstr1
很清楚了,pstr1<pstr2时从头部开始复制,pstr1>pstr2从尾部开始复制