2015 百度笔试的一道经典题目
来源:程序员人生 发布时间:2014-10-08 18:54:38 阅读次数:2556次
请编码实现memcpy函数:void *memcpy(void *dst,const void *src,unsigned int count) 显然是内存复制函数
下面是本人结合memcpy的源代码实现的一个测试用例,请大家指点
#include <stdio.h>
void *memcpy(void *dst,const void *src,unsigned int count)
{
char *p_dst = (char *)(dst);
char *p_src = (char *)(src);
unsigned int i;
if(p_dst>p_src && p_dst<=(p_src+count-1))
{
while(count)
{
*(p_dst+count-1) = *(p_src+count-1);
count--;
}
}
else
{
for(i=0;i<count;i++)
{
*(p_dst+i) = *(p_src+i);
}
}
return dst;
}
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memcpy(arr+4,arr,sizeof(int)*6);// 这样的拷贝 src<dst && src+count-1>dst,也就是说已经产生了覆盖,
//所以用从后往前的复制,进入if
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
// memcpy(arr,arr+4,sizeof(int)*6);// 这样的拷贝 src>dst && src<dst+count-1,
// 这和正常的拷贝一样,进入else
// for(int i=0;i<10;i++)
// printf("%d ",arr[i]);
printf("
");
return 0;
}
1 有人可能会问:
你的算法保证了任何情况下都能够把数据正确的复制到目的地址,但是你有没有考虑过在复制的过程中,你有可能修改了原始数据呢?
修改了原始串这样的功能明确么?
回答:对,老兄你说的很对,的确会存在这个问题,举个例子吧,比如hello
world,我们想把中间的空格去掉,滤掉空格就类似于操作系统中有一种内存分配方法,叫做可重地位分区分配,就是把小作业移动,去除中间的空隙,然后空出后面的一块大的内存地址,供其他程序使用。这样对原始数据不需要保存的情况下,可以应用这个函数。
2 可能你还有疑问:最后的dst+count = ' ' 假如传入的是char
型的数组,怎么办呢?你return dst如何判断空不空呢? ―― 好吧,这也是我的问题,请大神们帮助解答????
3memcpy()
和 普通 strncpy() 复制函数的区别,看代码吧,不多说了:
#include <iostream>
#include <cstring> // for c style string manipulation
using namespace std;
int main ()
{
char str1[]= "To be or not to be";// 18 个字符(含空格)+ '