2.百度笔试题
用C语言实现函数 void * memmove(void *dest, const void *src, size_t n) 。memmove 函
数的功能是拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址上。
/* 2.百度笔试题 用C语言实现函数 void * memmove(void *dest, const void *src, size_t n) 。memmove 函 数的功能是拷贝 src 所指的内存内容前 n 个字节到 dest 所指的地址上。 实现字节拷贝 char是字节 在C/C++标准库函数中存在该函数,它用于将src指向的n个字节的数据拷贝到dest位置。 在标准库函数中还存在另外一个函数memcpy,它也用来实现内存拷贝, 但它不考虑区间重叠问题,在拷贝过程中可能造成重叠错误。 而memmove则针对上诉问题给出了一定的处理措施来防止拷贝出错: (1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝 (2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝 (3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝 为了防止src+n<des 有重叠 实行倒着拷贝 则不会覆盖 下面给出memmove的具体实现,关于memcpy可参考库函数实现或相关资料。 */ #include <stdio.h> #include <assert.h> void *memmove(void *dest,const void *src, size_t n) { if (NULL==dest|| src==NULL) { cerr<<"NULL pointers!"; return NULL; } int step; char *p, *q; if ((char *)src==(char *)dest) //(1) return dest; else if ((char *)src>(char *)dest) //(2) { step=1; p=(char *)src; q=(char *)dest; } else// (3) { step=-1; p=(char *)src+n-1; q=(char *)dest+n-1; } for(int i=0;i!= n;++i) { *q=*p; p+=step; q+=step; } return dest; }