面试题--memcpy_函数实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
先来看看一段错误的示范: 找茬
void * memcpy(void *dest, const void *src, unsigned int count); {
if ((src == NULL) || (dest == NULL)) return;
while (count--) *dest++ = *src++; return dest; }
memcpy 函百度文库实现
memcpy函数的作用: 将由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指
向dest的指针。
想必大多数人在面试时被要求写 memcpy的实现,很不幸,我也吃过这个亏(这种题要是写的一塌糊涂后面完全没 戏),所以还是得提前准备一下,不然就只能呵呵了。
2/2
完善后的代码: void *memcpy(void *dest, const void *src, size_t count) {
if (dest == NULL || src == NULL ) {
return NULL; } char *tmp_dest = dest; const char *tmp_src = src; while (count--) *tmp_dest++ = *tmp_src++ ; return dest; }
if (dest == NULL || src == NULL || dest <= src+count) {
return NULL; } char *tmp_dest = dest; const char *tmp_src = src; while (count--) *tmp_dest++ = *tmp_src++ ; return dest; } 上面就是正确的版本了,我所能考虑到的问题都处理了。 另外,这段代码还可以优化,比如根据CPU的字节长度,把原来一个一个字节拷贝转换为按CPU的长度拷贝,等等。 感兴趣的话自己研究一下吧,这里就不介绍了。
特别说明: 1、与strcpy相比,memcpy遇到'\0'不会结束,而是一定要拷贝完n个字节,所以要指定拷贝的数据长度 2、memcpy可以拷贝任何数据类型的对象,如果dest和src的指针类型不一样,也需要处理,不能直接++使地址
自增(例如: int* p和 char*q, p++指针的值是4个4个加(0,4,8),q++是1个1个加(0,1,2,3,4)) 3、如果dest本身就有数据,执行memcpy()之后会覆盖原有的数据,所以src和dest所指向的内存区域不能有重叠 4、不能改变形参的值,定义新的临时变量来操作 5、参数提供的地址可能为空
1/2
这两种情况在memcpy中都是不允许出现的,需要在代码中处理以避免。 为了处理上面这两种情况,后来又提供了另一个函数memmove,在不需要保留原来内存区域的数据的时候可以使用 memmove。 最终的正确的版本: void *memcpy(void *dest, const void *src, size_t count) {
这样写的代码语法上看起来没什么问题了,但是不要忘记 src和dest所指向的内存区域不能有重叠,所以上面这段代 码还是有bug。这个算是不容易看出来的bug,如果这样写了以后代码出现问题就很难排除了,这也就是为什么写不 好这个函数指定会被淘汰的原因了。
dest和src所指向的地址有重叠的情况
内存地址重叠的情况分为两种,第一种是dest的地址在src地址的后面,另一种则是dest地址在src地址的前面。
相关文档
最新文档