memcpy函数是C语言中的库函数。
函数原型:
void *memcpy(void *dst,const void *src,size_t count);
用于把src所指向的内存区域拷贝到dst所指向的内存区域,count控制拷贝多少个。
因为拷贝的时候是按字节序拷贝的,所以实际操作的时候要把void *转换成char *,保证准确拷贝
void *memmove(void *dst,const void *src,size_t count);
用于把src所指向的内存区域拷贝到dst所指向的内存区域,count控制拷贝个数
void *memccpy(void *dest,void *src,unsigned char ch,unsigned int count);
将src区域所指定的字符串拷贝到dest所指向的内存区间,但是遇到ch则停止复制。
返回ch后的第一个字符的指针。
两者的区分:这两个函数的作用是一样的,但是当遇到内存发生重叠的时候,memmove保证拷贝的结果是正确的,
但是memcpy不保证拷贝结果的正确。
注:对于内存重叠的情况,memcpy函数是没有定义的,所以这个地方有bug,而memove函数考虑了地址重叠的情况,
但是memmove函数存在严重的效率问题,该函数是用到了临时变量的替换,把源字符串拷贝临时缓存,然后再从
缓存拷贝的目的地址,增加了一次不必要的开销.所以遇到这种情况的时候我们要尽量自己实现。
1.
void myMemmove(void *dest,const void *src,size_t count)
{
assert(dest);
assert(src);
char *pDest=(char *)dest;
char *pSrc=(char *)src;
//判断是否有内存重叠
if(pDest>pSrc&&pDest<src+count)//
{
while(count)
{
*(pDest+count--)=*(pSrc+count--);
}
}//不重叠
else
{
while(count)
{
*pDest++=*pSrc++;
}
}
return pDest;
}