实现Memcpy函数

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

面试中面试官经常会让写程序,根据题目的难度会在算法和编程习惯上各有侧重。比如写一个memcpy函数,这个题算法简单明确,因此重点考察编程习惯、工程思想。

该题目的算法如下

void memcpy(void *dst, void *src, int count)

{

while(count--)

{

*dst = *src;

dst++;

src++;

}

}

问题是void*不能直接累加*dst = *src也是不对的。

void memcpy(void *dst, void *src, int count)

{

unsigned char *pdst = (unsigned char *)dst;

unsigned char *psrc = (unsigned char *)src;

while(count--)

{

*pdst = *psrc;

pdst++;

psrc++;

}

}

在32位系统中,可复制的最多内存是多少?类型会不会不够用?内存复制不应该修改原始内存吧。

因此,函数声明修改如下void memcpy(void *dst, const void *src, size_t count)

这样就万事大吉了吗?如果传入了空指针呢?

接着修改吧

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

{

assert(dst != NULL);

assert(src != NULL);

unsigned char *pdst = (unsigned char *)dst;

const unsigned char *psrc = (const unsigned char *)src;

while(count--)

{

*pdst = *psrc;

pdst++;

psrc++;

}

}

如果有这样的数组char ina[]={0,1,2,3,4,5,6,7,8,9,10,11}; 进行如下调用memcpy(&ina[1], &ina[0], 5);会发生什么情况?由于原始数据和目的数据在空间上存在重叠,这样导致复制过

程中不可避免会对原始数据做修改。而这样的修改在函数的声明中是看不到的(const void *src)。如果降低要求,可以修改原始数据完成复制,那么这样的设计能实现么?这里有一个版本可供参考。但是这样的实现使得函数的功能不明确,可以认为是一种异常情况。

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

{

assert(dst != NULL);

assert(src != NULL);

unsigned char *pdst = (unsigned char *)dst;

const unsigned char *psrc = (const unsigned char *)src;

assert(!(psrc<=pdst && pdst

assert(!(pdst<=psrc && psrc

while(count--)

{

*pdst = *psrc;

pdst++;

psrc++;

}

}

到这里实现已经比较健壮了。有些人想要链式的调用函数,也就是复制完内存后,返回值直接当做其他函数的参数。

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

最终版本为

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

{

assert(dst != NULL);

assert(src != NULL);

unsigned char *pdst = (unsigned char *)dst;

const unsigned char *psrc = (const unsigned char *)src;

assert(!(psrc<=pdst && pdst

assert(!(pdst<=psrc && psrc

while(count--)

{

*pdst = *psrc;

pdst++;

psrc++;

}

return dst;

}

相关文档
最新文档