关于memcpy的实现
今天去面试,面试官出了一个关于memcpy的函数原型的实现的问题,本来这个问题是很简单的,但是不知道当时怎么脑子一抽竟然写错了,真是”累觉不爱”了.感觉这份工作算是泡汤了,算了事情发生了,错过了也就错过了.既然这样就把这件事情记录下来,给自己提个醒~
这个问题对于接触过的朋友自然不难,问题在于给自己一个分析的方法,遇到类似的问题怎么解决.
memcpy实现内存拷贝,根据这个问题,我们可以提取出下面几点:
1.可以拷贝任何数据,数据类型不能受限
2.源数据不能被改变
通过上面两点可以确定函数原型为void *memcpy(void *dest, const void *src),现在分析一下这些足够了吗?这个函数拷贝什么时候结束,当时我就用了这个函数原型,由于是拷贝的任意数据,所以不能指定一个明确的结束标志,既然这样那么只有明确的指定拷贝的大小才可以.所以函数原型变成这样void *memcpy(void *dest, void *src, size_t count);好吧,函数原型既然已经确认了,剩下的应该就是写函数了,先等等,先别急着写函数,实际上对于C语言的开发者来说,重要的不是函数功能的实现,重要的是函数出错时的处理,如果你用的是Java或者C#大不了抛个异常出来,软件崩溃一下,不会对其他造成任何影响;C这东西弄不好会把整个系统弄瘫痪,所谓”兵马未动,粮草先行”,我么还是先考虑考虑出错的问题吧!我们根据函数原型来分析,
void *memcpy(void *dest, const void *src, size_t count);
1.空指针的问题,如果dest、src两者或者两者之一为NULL,那么自然能没得完了;
2.拷贝大小count为小于等于0的值,自然也是不正确的;
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;
}
关于memcpy的实现的更多相关文章
- memcpy内存复制
memcpy(predata,frame,1920*1080*4);
- strcpy strlen memcpy等的函数实现
#include <assert.h> #include <string.h> #include <stdlib.h> #include <stdio.h&g ...
- memcpy函数用法
memcpy函数用法 .分类: VC++ VC++ mfc matlab 2011-12-01 19:17 14538人阅读 评论(0) 收藏 举报 null 原型:extern void *memc ...
- memcpy和memmove
memcpy函数 函数原型 void *memcpy(void *dest, const void *src, size_t n); dest:目标地址 src: 起始地址 n: 字节数 头文件 st ...
- strcpy和memcpy的区别(转载)
strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...
- strncpy和memcpy的区别
今天不小心在该用memcpy的时候,用了strncpy使自己吃了亏,所以写出这个博文. memcpy就是纯字节拷贝,而strncpy就不同了,字符串是以'\0'结尾的.如果一个字符buffer长度为6 ...
- strcpy vs memcpy
[本文连接] http://www.cnblogs.com/hellogiser/p/strcpy_vs_memcpy.html [分析] strcpy和memcpy都是标准C库函数,它们有下面的特点 ...
- memcpy vs memmove
[本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...
- SEH-关于捕获memcpy的异常
网上有说memcpy是C语言写的,没有异常处理机制. 但是貌似SEH可以处理. SEH("Structured Exception Handling"),即结构化异常处理·是(wi ...
- 等号赋值与memcpy的效率问题
转自:http://www.aiuxian.com/article/p-1309055.html 偶尔看到一个说法,说,小内存的拷贝,使用等号直接赋值比memcpy快得多.结合自己搜集到的资料,整理成 ...
随机推荐
- 原生JS实现旋转轮播图+文字内容切换
废话不多说,直接上图看效果: 需求:点击左右按钮实现切换用户图片与信息: 原理:点击右侧左侧按钮,把3号的样式给2号,2号的给1号,1号的给5号,5号的给4号,4号的样式给3号,然后根据现在是第几张图 ...
- Ruby(1):入门
安装: 一般来说linux会自动装ruby,可以通过: ruby -v 来查看ruby版本 直接使用ruby命令的话,是用来执行ruby文件的.如果要打开交互式ruby解释器.只需要在控制台输入:ir ...
- IOS多选单选相册图片
之前做项目让实现多选相册的图片,自己写了一个demo一直保存在电脑上,今天下午发现电脑128G的容量已经快没有了,准备清理电脑,所以把之前做的一些demo放在博客上,以后方便用. 1.首先准备3个图片 ...
- 批量删除SVN文件
开发过程中,有时需要将SVN目录中的SVN相关的信息去掉,有两种简单方法可以做到: 一,用SVN的export功能 二,将下面的这段文字写在.reg结尾的文本文件中,然后执行.这样你在每个文件夹右击的 ...
- C# 创建、部署、调用WebService
webservice 可以用于分布式应用程序之间的交互,和不同程序之间的交互. 概念性的东西就不说太多,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 201 ...
- ETL第一篇(Kettle Spoon) 初遇
ETL第一篇(Kettle Spoon) 初遇 ETL第二篇 调用webservice 简介 Kettle 是一款国外开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定(数据迁移 ...
- Java 运行时数据区域
1. 整体分类 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 运行时常量池 直接内存 2. 程序计数器 每个线程一个计数器,线程的私有内存 指向的是字节码的内存地址? 如果线程执行的是 Ja ...
- nginx 安装配置和常用命令
基本环境:CentOS 1. 下载 nginx [root@localhost ~]# cd Downloads/ [root@localhost Downloads]# wget http://ng ...
- HDU 2045 RPG难题
http://acm.hdu.edu.cn/showproblem.php?pid=2045 这道题也是用倒推: 先假设前n-2个块都已经涂好,涂第n-1块时有以下两种情况: 1.n-1和1相同,则n ...
- 快速幂取模(POJ 1995)
http://poj.org/problem?id=1995 以这道题来分析一下快速幂取模 a^b%c(这就是著名的RSA公钥的加密方法),当a,b很大时,直接求解这个问题不太可能 利用公式a*b%c ...