问答题 如何自定义内存复制函数memcpy()
【正确答案】
【答案解析】memcpy是C语言中的内存复制函数,它的函数原型为void *memcpy(void *dest, const void*src, size_t n)。它的目的是将src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回指向destin的指针。需要注意的是,src和dest所指内存区域不能重叠,同时,与strcpy相比,memcpy遇到"/0"不结束,而是一定会复制完n个字节。而且如果目标数组dest本身已有数据,执行memcpy()之后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到要追加数据的地址。
memcpy()函数用来做内存复制,可以拿它来复制任何数据类型的对象,可以指定复制的数据长度,例如:
char a[100],b[50];
memcpy(b,a,sizeof(a));
strcpy和memcpy都是用于从一块内存复制一段连续的数据到另一块内存,区别是终结标识不同。strcpy(a,b)从b复制内容到a,然后从b+1复制内容到a+1,依次类推,直到b+i的内容是"/0"。而memcpy(a,b,c)从b开始复制c字节内容到a,相比strcpy,memcpy是确定复制c个字节的。所以只要保证b开始有c字节有效数据,a开始有c字节内存空间就行。
自定义内存复制构造函数示例如下:
#include<stdio.h>
void* MyMemCpy(void *dest,const void *src, size_t count)
{
char* pdest=static cast<char*>(dest);
const char* psrc=static_cast<const char*>(src);
if((pdest>psrc)&&(pdest<(psrc+count)))
{
for(size_t i=count-1;i!=-1;--i)
pdest[i]=psrc[i];
}
else
{
for(size_t i=0;i<count;++i)
pdest[i]=psrc[i];
}
return dest;
}
int main()
{
char str[]="0123456789";
MyMemCpy(str+1,str+0,9);
printf("%s/n",str);
MyMemCpy(str,str+5,5);
printf("%s/n",str);
return 0;
}
程序输出结果:
0012345678
4567845678