现在的位置: 首页 > 综合 > 正文

83 2.百度笔试题 memmove

2018年01月19日 ⁄ 综合 ⁄ 共 903字 ⁄ 字号 评论关闭

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;  
} 

抱歉!评论已关闭.