关于memcpy的实现

今天去面试,面试官出了一个关于memcpy的函数原型的实现的问题,原本这个问题是很简单的,可是不知道当时怎么脑子一抽居然写错了,真是”累觉不爱”了.感受这份工做算是泡汤了,算了事情发生了,错过了也就错过了.既然这样就把这件事情记录下来,给本身提个醒~ c++

这个问题对于接触过的朋友天然不难,问题在于给本身一个分析的方法,遇到相似的问题怎么解决. 面试

memcpy实现内存拷贝,根据这个问题,咱们能够提取出下面几点: 函数

1.能够拷贝任何数据,数据类型不能受限 spa

2.源数据不能被改变 指针

经过上面两点能够肯定函数原型为void *memcpy(void *dest, const void *src),如今分析一下这些足够了吗?这个函数拷贝何时结束,当时我就用了这个函数原型,因为是拷贝的任意数据,因此不能指定一个明确的结束标志,既然这样那么只有明确的指定拷贝的大小才能够.因此函数原型变成这样void *memcpy(void *dest, void *src, size_t count);好吧,函数原型既然已经确认了,剩下的应该就是写函数了,先等等,先别急着写函数,实际上对于C语言的开发者来讲,重要的不是函数功能的实现,重要的是函数出错时的处理,若是你用的是Java或者C#大不了抛个异常出来,软件崩溃一下,不会对其余形成任何影响;C这东西弄很差会把整个系统弄瘫痪,所谓”兵马未动,粮草先行”,我么仍是先考虑考虑出错的问题吧!咱们根据函数原型来分析, blog

void *memcpy(void *dest, const void *src, size_t count); 内存

1.空指针的问题,若是dest、src二者或者二者之一为NULL,那么天然能没得完了; 开发

2.拷贝大小count为小于等于0的值,天然也是不正确的; get

3.目标有没有足够的大小容纳源数据,这个咱们在函数内部彷佛也没法进行保证,可是咱们本身也要想到 原型

4.内存地址有没有重叠,这个咱们暂时不考虑了。

有了上面的提示写起来天然比较简单了

#include <stdio.h>

void *memcpy(void *dest, const void *src, size_t count)

{

if (NULL == dest || NULL == src || count <= 0)

return NULL;

while (count--)

*dest++ = *src++;

return dest;

}

上面这段代码在Linux中使用gcc编译是没错的,可是会有警告,因此改为这样:

#include <stdio.h>

void *memcpy(void *dest, const void *src, size_t count)

{

if (NULL == dest || NULL == src || count <= 0)

return NULL;

while (count--)

*(char *)dest++ = *(char *)src++;

return dest;

}

OK,也就这样了,要是面试官再问起内存重叠的问题,你再和他侃侃.

个人面试算是泡汤了.

总结:不要着急慢慢来,根据需求推出原型,根据原型推断问题,这算是个教训吧!!!


补充:

在这里很是感谢博客园的求道于盲  这位好心的网友指出了我程序中的两个错误,再次感谢.

1.返回了一个++过的指针

2.size_t是无符号类型的,size_t的定义为:typedef unsigned int size_t;

因此count<=0,只会判断==0的状况,若是传入-1,会产生一个很大的无符号整型.

但愿别人注意,改过的程序以下:

void *memcpy(void *dest, const void *src, int count)

{

void *ptr = dest;

if (NULL == dest || NULL == src || count <= 0)

return NULL;

 

while (count--)

*(char *)dest++ = *(char *)src++;

 

return ptr;

}

相关文章
相关标签/搜索