购物车0种商品
IC邮购网-IC电子元件采购商城
今天到华为面试被bs了,他给我出了一个题没答上来!大家给
(2011/10/29 9:02:00)
我本来投的是硬件,可是硬件已经招满,就给俺分到软件组去面试了,郁闷!
面试官给俺出了一个题,说是怎样将n个字节从一个地址拷贝到另一个地址,要用一个完整的函数表达出来,有两点,必须n个字节,必须是一个完整的函数。
我随便写了一个,看他那眼色,肯定不对。
然后他又问我写出的函数中,全局变量放在数据存储区什么地方,局部变量放在什么地方,俺一个汗阿,平时用C语言从来没管这些,请各位大虾在这里给我解答一下好吗?

网友评论:对传入参数进行检查,理论上是很应该的……但是如果大家有兴趣打开linux或者glibc看看源码的实现,就会发现几乎没有注释而且代码“乱七八糟”……

程序的健壮性是靠系统工程来实现的……


网友评论:华为人的整体素质还可以, 太差了是进不去。

不过也就如此而已。

网友评论:搂主,面试软件,林锐的教程研究研究才好啊。

现在企业,用林博的这个考的少了,一段时间是很多企业招人标准题目。

不过,就是不考试,还是值得学习的,另外一个叫“0x10个问题”的小教材也不错.

网友评论:/***************************************
******函数名称:dcopy()
******功能描述:100字节的数据块COPY;
******输入:
******输出:
******全局变量:
******调用函数:
******异常处理:
****************************************/

……


网友评论:因为你的程序如果没有完整的说明;没有标准的良好的书写格式,程序写的再精妙过几天也就无从考证了;在后续的排错过程中将陷入困境;
再说你的程序是你写的,用的人要看懂它。
如果你是系统分析员,那么你将面临更残酷的考验;文档的比例有可能3到5倍于程序代码;

网友评论:至少要区分出堆和栈来,虽然这是编译器给做好了的,但是也必须了解。因为这是软件最底层的东西。华为面试这个题经常出,天天出。

虽然对于单片机的编译器,会变成根本不是那么回事情,但是你还是要回答,没有办法,象PIC的CCSC编译器,根本就不是这么样分配的,因为PIC不支持堆栈访问。

网友评论:这是从谭浩强的《C语言程序设计》中看到的:
内存中供用户使用的存储空间分三部分:

1.程序区2.静态存储区3.动态存储区

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放。静态局部变量也放在静态存储区。

动态存储区存放以下数据:
1)函数形式参数;
2)自动变量(未加static声明的局部变量);
3)函数调用实的现场保护和返回地址;





网友评论:NANDFLASH如何把N个字节从一个地址拷贝到另一个地址里去,没有任何底层函数支持,完全汇编。下面这个NANDFLASH测试板我做的,用了1K汇编

网友评论:void*memcpy(void*t,void*s,,unsingedintlen)
{
char*t1,*s1;
t1=(char*)t;
s1=(char*)s;

while(len--)*t1++=*s1++;
returnt1;
}

所谓的‘len<0’是不存在的。

全局变量存放在公共数据区,各函数都能存取。而局部变量是否在堆栈上就难说啦。但有两点可以肯定:(1)局部变量的内容只有在本函数运行时才有效;(2)
编译器会设定本函数才能存取局部变量。还需补充的是,有些单片机的编译器会
让互不相关的函数共享一块RAM区,存放局部变量。

网友评论:没有统一答案,而且主要影响效率,有时还影响可重入。变量定义在哪儿,这才是程序是否可读可维护的关键。其实原则再简单不过:作用域越“局部”越好,能用局部变量或参数的,不要用全局变量

既然说“完整”的函数,注释、ASSERT还是必要的吧?

对于这个具体的函数,如果要功能完整,应该考虑两个内存块部分重叠的情况,这是简单拷贝会出错,因为人家说的是任意n个

网友评论:五、编写strcpy函数(10分)
已知strcpy函数的原型是
char*strcpy(char*strDest,constchar*strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcpy
char*strcpy(char*strDest,constchar*strSrc);
{
assert((strDest!=NULL)&&(strSrc!=NULL));//2分
char*address=strDest;//2分
while((*strDest++=*strSrc++)!=‘’)//2分
NULL;
returnaddress;//2分
}
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?
答:为了实现链式表达式。//2分
例如intlength=strlen(strcpy(strDest,“helloworld”));

网友评论:如果这个内存复制在关键业务路径里面,一个一个字节复制的确要被BS。
我们一般复制内存块都有对齐和非对齐的讲究;
如果对齐复制,那么不要用字节,用字(四字节)。
如果非对齐,则掐头去尾后再对齐。

HW的软件用他们自己弄的DopraVOS操作系统,里面的内存复制函数就是一个一个字节复制的,关键路径里面用起来就很损失性能了。不过现在他们改了没有就不知道鸟:)
当然,一般地,关键业务路径不允许内存复制,呵呵

网友评论:有个兄弟是HW过来的,他说HW都用PPC/MIPS/x86。
这些东西都是32位处理器。

唉,现在的MIPS已经都是64位的了,不过没准他们还没有用上……

网友评论:越是关键的地方,越是要精打细算,仔细优化

网友评论:善于收集别人的成果,去伪存精,为我所用就不错。

林博的答案有几下几个优点:
1、运用了断言assert,假定"原串"与"目地串"均为不空的指针,是空指针则不存在复制的过程;
2、函数有指针型返回值,便于与标谁的ANSI的C环境String库函数兼容及前面网友提到的链式复用;
3、运用了转义字符“”,作为复制结束的判据,比较规范;
4、运用了Const关键字,对函数入口的指针进行了显式约束,防止对指针变量指向的内容作非预期的改变。

存在的不足:
1、函数的功能说明做得不好,尤其是入口参数与返回值的约定;
2、命名用简名,没有全名直观,比如宜用Copy替代cpy,用Source代替src

网友评论:好想这么多人都没看过《C陷阱与缺陷》。说不定考官就是考考你看没看过一些最基本的参考书呢。

网友评论:实际中的单片机里面的C,没有几个标准的。
CCSC的存储器分配是比较个性的,所有的都是全局变量,然后根据函数的重入性再复用。lst文件可以看的出来。

AVR单片机的指令和数据不是一个总线,所以再codevisionAVR中把const给挪用成了flash。
constchar*a;是一个指向flashchar类型的指针,此指针存于ram,而不是C++中的意思,这个变量的值不允许修改。
char*consta;是一个存储于flash的char类型指针。

但是去考试,还是要说,局部变量在堆里,函数参数在栈里......俨然都是X86架构下的C语言编译器的常规做法。

林锐也说自从经商以后就很少做技术了,但是现在来看,考的东西还都是他的书上的为多。偶和林博士是校友,同姓,当然没有他那个水平和那么高的学位。

但是华为的几年了考试就出这个strcpy,确实应该让人bs一下。




网友评论:好像只有22楼的同志说到点子上

网友评论:在PC机里,全局变量放静态存储区,局部变量放动态存储区
在TMS320CXXX中,全局变量放在你声明的段中,局部变量放在堆栈中
...

网友评论:林的东西对初学者不错.
没有大讲什么设计理论,就是平常编程时候,不注意的或者是没有关注到的点点滴滴.很好.
即使不是为了应付考试,也是完全值得一读的.

网友评论:记得在哪本书上看过,写出来没有bug的还真不容易。
至少楼上3#,16#几位的都考虑的不全面。


网友评论:intmemncpy(char*pcDes,constchar*pcSrc,unsignedlongulLen)
{
if((NULL==pcDes)||(NULL==pcSrc))
{
return0;
}
while(ulLen--)
{
*pcDes++=*pcSrc++;
}
return1;
}

网友评论:学习学习,

网友评论:如果dst+length区域和src+length区域有重合,这个时候
while(len--)
{
*_d++=*s++;
}
这段程序就会出问题,如果src<dst即src地址在前,而src+length>dst,这个时候就会发现拷贝src的前面的数据其实是覆盖了src的后面部分的数据,这样就出问题了,所以在拷贝之前要判断src和dst的大小

网友评论:学习

网友评论:1)n的大小范围?
2)用的处理器或系统剩余ram?
3)“源”和“目的”指针在可读写区还是只读区?

你把这三问考他一下都不用写程序就可以过关了....

网友评论:晕倒
这个问题应该是这样的
1:考察你是否会C语言
这个检查你是否会使用指针啊什么的。会这个只是基本合格
2:考察你有没有做参数检查这点答对了你就说明你很优秀
源指针目的指针长度之间的关系很复杂。
譬如源在0x00处目标地址在0x04处,要拷贝10个字节。
那么上面所有人写的代码都错了
因此函数最起码是:
intMemCpy(BYTE*pSrc.BYTE*pDes,unsingedintLen){
//参数合法性检查
//如果目的地址大于源地址从后象前拷
//如果源大于目的地址,从前向后拷贝
}
这道题华为和中兴都是要考的




}


网友评论:总是出一些火星题.

这个公司真的不好吗?

非常垃圾吗?

靠,我还面试了四轮呢.

如果不好咱就不去了.



网友评论:uchar*_mencpy(uchar*s,uchar*d,uintn)
{
uinti;
for(i=0;i<n;i++)
{
*s=*d;
s++;
d++;
}
returns;
}

全局变量放在RAM的全局区,局部变量放在RAM的栈区.

网友评论:全局变量在堆里面,局部变量在栈里面。C语言堆和栈不是一个概念

网友评论:我是新手来报个到!

网友评论:表情:

网友评论:那些出题的,出的题以为人家看得懂答不出来,其实大多数情况是连他想问什么都看不懂的。。严重反bs。。。

网友评论:不懂就是不懂的啦,没啥了不起的啦...............

预防一下先。。。。

网友评论:应该讲你没有在那里工作是你的幸运!一个公司的发展不是这样考个人就能有多大的能力,他们因该洞察一个人的潜力!打破常规的用人制度是目前潜力公司的发展战略!你如是金会被发现!

网友评论:看来现在找到出题人出来说两句才是最关键的!

网友评论:比较实用的答案就是楼上各位的综合!容错与避错并举。

网友评论:可惜我不懂软件!

网友评论:华为确实很难进去的啊,呵呵

网友评论:我面试过华为N次,n次都没去,第一次是大学毕业那会,问我802.11,一窍不通
后来基本上保持一年一次的几率面试、笔试,后几年都顺利通过,只是工资谈不拢没过去,奇怪的是每年都有不同的部门,不同城市的华为约我去。
唉。。。
中间的故事很多。
我要说的是他们面试就一套题目,都是林锐说过的,没啥新意。虽然有部分改变,但只要你真正理解了,拿个90分还是没问题的。
不过现在我是再也不想去华为了。面试也懒得去。

网友评论:如果是len等于0的时候会怎么样呢?

网友评论:全局变量未赋初值的存在.BSS段,
赋初值的在堆区。

局部变量在栈区。

网友评论:思路:
先用LDM指令将一片连续地址的内容加载到寄存器列表中;
再用STM指令将各寄存器的内容存储到另外一片连续地址中。

网友评论:局部变量存在于(堆栈)中,
全局变量存在于(静态区)中,
动态申请数据存在于(堆)中。

至于楼主的程序,看一眼就知道它会崩溃。

浏览:(1406)| 评论( 0 )
博文评论

  • 昵 称:
  • 内 容:10~250个字符
  • 验证码: 验证码看不清楚?请点击刷新验证码
  •                      
  • 博文分类

    热点博文

    最新博文

    最新评论

    IC电子元件查询
    IC邮购网电子元件品质保障