1、strcpy不考慮內存重疊函數原型如下:
char *strcpy(char *strDest, const char *strSrc){
assert((strDest!=NULL) || (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ ) ;
return address ;
}
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;
}