您的位置:首页 > 其它

strcpy,memcpy,memmove的内存重叠

2016-07-19 17:29 260 查看
1、strcpy不考虑内存重叠函数原型如下:

char *strcpy(char *strDest, const char *strSrc){

assert((strDest!=NULL) || (strSrc !=NULL));

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘\0’ ) ;

return address ;
}

2、memcpy在不考虑内存重叠的情况可以写成这样:
void* memcpy(void *dest, void *src, size_t size)
{
if(dest == nullptr || src == nullptr)
return nullptr;
void *result = dest;

while(size--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}

return result;
} 内存重叠是指拷贝源地址与目标地址发生重合。重叠从两方面考虑:

(1).dest数据覆盖了source; 如:dest(8byte) 地址:1000

source(8byte) 地址:1002

(2).dest所指的区域本来就是source的一部分; 如:dest(8byte) 地址:1000

source(8byte) 地址:0998

3、所以,在考虑重叠的情况下,应类似memove,改变memcpy

void *memcpy(void *dest, void *src, size_t size)
{
if(dest == nullptr || src == nullptr)
return nullptr;
void *result = dest;

if(dest < src || (char*)src+size < (char*)dest)//没有内存重叠
{
while(size--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest+1;
src = (char*)src+1;
}
}
else//有内存重叠
{
dest = (char*)dest+size-1;
src = (char*)src+size-1;
while(size--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest-1;
src = (char*)src-1;
}
}
return result;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: