void * memcpy(void * destination, const void * source, size_t num);
当源字节串和目标字节串重叠是,bcopy能够正确处理,但是memcpy的操作结果不得而知,这种情况必须改用ANSI C的memmove函数[网络编程]。故该函数实现过程中要考虑src 和dst是否有重叠的情况。
内存重叠:拷贝的目的地址在源地址范围内。所谓内存重叠就是拷贝的目的地址和源地址有重叠。
重叠从两方面考虑:
(1).dst部分数据是src的
(2).src部分数据是dst的
#include <iostream>
#include <string>
using namespace std;
void testMemcpy(void *dst, const void *src, size_t size)
{
if(!dst || !src)
return;
char *pDst = static_cast<char*>(dst);
const char* pSrc = static_cast<const char*>(src);
if(pDst <= pSrc || pSrc + size <= pDst)
{
while(size--)
{
*pDst++ = *pSrc++;
}
}
else
{
pDst += size - 1;
pSrc += size - 1;
while(size--)
{
*pDst-- = *pSrc--;
}
}
}
int main()
{
char test[100] = "aaaaaa";
char test2[100];
testMemcpy(test2, test, sizeof(test));
std::cout << test2 << std::endl;
return 0;
}