memcpy函数原型如下:
void *memcpy(void *dst, const void *src, size_t n)
功能:用来拷贝src所指的内存内容前n个字节到dst所指的内存地址上。
使用时应当注意以下几点:
1、如果复制的字节数n超出了dst的空间容量,或者n超出src的容量,此函数是不会进行判断的,这样就很危险。因此,需要程序员自己检查是否有溢出的情况出现。
2、此函数不会检查参数dst与参数src所指向的数组(或其他类型)是否具有同样的空间大小。
3、如果出现src地址大于dst地址(即地址重叠),就会出现dst无法存取完整数据,造成src数据丢失。
总之,memcpy本身是有bug的,并没有解决覆盖问题,可以用memmove代替,也可以自己实现。
void *my_memcpy(void *dst, const void *src, size_t n)
{
char *psrc = NULL;
char *pdst = NULL;
if((NULL == dst) || (NULL == src))
{
return NULL;
}
/*出现重叠,反向拷贝(由高到低)*/
if((src < dst) && (((char*)src + n) > (char*)dst))
{
psrc = (char*)src + n - 1;
pdst = (char*)dst + n - 1;
while(n--)
{
*pdst-- = *psrc--;
}
}
else
{
psrc = (char*)src;
pdst = (char*)dst;
while(n--)
{
*pdst++ = *psrc++;
}
}
return dst;
}
------------------------------------------------The end---------------------------------------------------