入公司笔试嵌入式笔试题(16道C语言面试题).pdf
《入公司笔试嵌入式笔试题(16道C语言面试题).pdf》由会员分享,可在线阅读,更多相关《入公司笔试嵌入式笔试题(16道C语言面试题).pdf(137页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、16道试题C 语言面试题1.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#define SECONDS PER YEAR(60*60*24*365)UL我在这想看到几件事情:1).d e fin e 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2).懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。3).意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。4).如果你在你的表达式中用到UL(表示无符号长整型),那么你有了 个好的
2、起点。记住,第一印象很重要。2.写一个“标准”宏 M IN,这个宏输入两个参数并返回较小的一个。#define MIN(A,B)(A)6)puts(6):puts(6”。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。13.评价下面的代码片断:unsigned int zero=0;unsigned int compzero=OxFFFF;/*Vs complement of
3、zero*/对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero=0;这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就
4、当是这个娱乐吧动态内存分配(Dynamic memory allocation)14.尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是P.J.Plauger,他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入种虚假的安全感觉后,我拿出这么一个小节目:下面的代码片段的输出是什么,为什么?char*ptr;if(ptr=(char*)malloc(0)=NU
5、LL)puts(Got a null pointer);elseputs(Got a valid pointer);这是一个有趣的问题。最近在我的一个同事不经意把0 值传给了函数m alloc,得到了 个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a validpointer。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。Typedef15.Typedef在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:#
6、define dPS struct s*typedef struct s*tPS;以上两种情况的意图都是要定义dP S 和 tP S 作为个指向结构s 指针。哪种方法更好呢?(如果有的话)为什么?这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:dPS pl,p2;tPS p3,p4;第一个扩展为struct s*pl,p2;上面的代码定义p l 为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了 p 3 和 p 4 两个指针。晦涩的语法16.C 语言同意一些令人震惊的结构,下面的结构是合法的吗
7、,如果是它做些什么?int a=5,b=7,c;c=a+b;这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c=a+b;因此,这段代码持行后a=6,b=7,c=12o如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题嵌入式软件工程师笔试题1、将一个字符串逆序2、将一个链表逆序3、计算一个字节里(b
8、 y te)里面有多少bit被 置 14、搜索给定的字节(byte)5、在一个字符串中找到可能的最长的子字符串6、字符串转换为整数7、整数转换为字符串1 前后交换2。直接?3 o while(n=(n&n-1 )count+;4.5.动态规划电子信息类 公司招聘C 笔试题1 .改错(5 分)void test()|char str10;char*strl=0123456789”;strcpy(str,strl);)2.改错(5 分)void test()char str10,strl 10;for(int=0;i10;i+)str=a;strcpy(str,strl);3.读程序,写出结果(5
9、分)int sum(int a)(int c=0;static int b=3;c+=1;b+=2;return(a+b+c);)int main()int a=2;for(int i=0;ilink=q-link;q=p-link;B:p-link=q;q-link=p-link;C:q-Iink=p-Iink;p-link=q;D:q=p-link;p-link=q-link;3、在一种语言中,运算符是从右向左结合的(例如:a+b+c=a+(b+c)下面表达式“7-(16/(3+1)*2)-4的结果是(C)A-1;B、1 ;C、3;D 7;E、9;4、程序的局部变量存在于(B)中,全局变量
10、存在于(A)中,动态申请数据存在于(C)中A:数 据 段 B:堆 栈 C:堆空间5、循环链表指(A、C)A:最后一个节点的指针域总是指向链表头 B:可疑自由膨胀的链表C:链表含有指向上级节点的指针域 D:以上都不是6、下列是一个C 语言函数:int f(int a)int b;switch(a)(case 1 :b=10;case 2:b=20;case 3:b=30;default:b=0;return b;在其它函数中调用f(1),f(2),f(4),的返回值依次是:D,D,DA:10 B:20 C:30 D:07、进程和线程的最主要区别在于:(B、C、D)A:进程是UNIX下的概念,线程
11、是Windows下的概念;B:进程的效率比线程低;C:在进程中可以创造线程,但线程中不能生成进程;D:进程有自己的运行空间,线程的运行空间是共享的8、如下代码:unsigned int ulBuf10;int I;unsigned char uclnfdl 0;for(I=0;I10;R-b)ulBuf=I+l;uclnfb=0;sprintRuc In But);请问uclnfo0中的值应该是什么(D)A:0 B:1 C:0 或 1 D:不确定9、下面程序的运行结果是多少?(D)main()char chr=127;int sum=200;chr+=1;sum+=chr;printf(wsu
12、m=%dn,sum);retum(O);A:327 B:328 C:99 D:7211、软件需求分析阶段的测试手段一般采用(C)。A 总 结 B 阶段性报告C 需 求 分 析 评 审 D 不测试12、有如下的Hash函数:unsigned short hashf(unsigned short key)return(key 4)%256 hashf(l 6)和 hashf(256)的值 A:1,16 B:8,32 C:4,15 D:1,3213、enum A,B,C,D,E,K=8,J,M;请说出 D=jA:3 B:4 C:5 D:6 E:714、下面的代码中的含义是什么#ifhdef _oss
13、_LIB_H_#define _oss_LIB_H_#endifA.包含oss的 Lib库 B:定义一个常量 C.不包含oss的 Lib库D.防止头文件被重复引用15、下面程序的运行结果是多少?#include main()char chr=127;int sum=200;chr+=1;sum+=chr;pfintf(sum=%d/rT,sum);return 0;A:327 B:328 C:199 D:7216、以下手段哪些可用于进程间的同步与互斥 A:信号量与PV 原 语 B:B 树 C:进程上下文 D:临界区加锁17、对 栈 S 进行下列操作:push(l),push(2),pop(),
14、pop()则此时栈顶元素是A:1 B:2 C:0 D:不确定18、switch(c)中的c 不能是哪种数据类型A:char B:long C:unsigned D:double E:float19在 Windows95环境下,定义数组:int 则数组a 所占用的内存单元为A:6 字节 B:24字节 C:48字节 D:不能确定20、类型定义:chair S3=,AB,1 char*p;在执行了语句p=s之后,*(p+2)的值是A:B:字符,B,的地址 C:40 D:不确定 E:以上答案均不正确21、下面对宏的定义和使用,哪些是错误的?A:#define RECTANGLE_AREA(a,b)(a
15、*b)B:#define RECTANGLE_AREA(a,b)(a)*(b)C:#define INTI_RECT_VALUE(a,b)D:#define MBUF_CLEAR_FLAG(pstMBufM,ulflagM)(pstM EufM)-stUserTagData.stCommon Infb.ul Flag&=(-(ulFlagM)21、下面二叉树前序遍历的顺序是 azb cA:a,b,c B:b,a,c C:b,c,a D:c,b,a22、对下列关键字序列用快速排序进行排序时,速度最快的情形是A:25、23、30、17、21、5、9 B:、9、17、30、25、23、5)C:21、
16、25、5、17、9、23、30 D:5、9、17、21、23、25、3023、在下列叙述中,错误的一条是A:操作系统是用户与计算之间的接口;B:程序的并发执行,使程序失去了顺序执行时具有的封闭性和可再现性,程序与程序的执行不再-对应。C:进程从一个状态到别一个状态的转换,都是靠使用不同的原语来实现。D:在单CPU的系统中,任何时刻处于就绪状态的进程有多个,而且,只有处于就绪状态的进程经调度程序选中后方可进入运行状态。24、卜面关于内容存管理的说法哪种是正确的A:页式内存管理存在严重的碎片问题B:段式内存管理不存在抖动问题C:分区式内存管理既存在碎片问题,又存在抖动问题D:段页式内存管理既减少了
17、碎片问题,又减少了抖动问题二、简答题1、const char*,char const*,char*const 的区别?解答:把一个声明从右向左读。char*const cp;(*读成 pointer to)cp is a const pointer to charconst char*p;p is a pointer to const char;char const*p;同上因为CH里面没有const*的运算符,所以const只能属于前面的类型。2、下面这个程序执行后会有什么错误或者效果:Sdefine MAX 255int main()|unsigned char AMAX,i;for(i=
18、0;i=MAX;i+)A=i;解答:MAX=255数组A 的下标范围为:O.MAX1,这是其一.其二.当i 循环到255时,循环内执行:A255=255;这句本身没有问题.但是返回fbr(i=0;iv=MAX;i+)语句时,由于unsigned char的取值范围在(O.255),i+以后i 又为0 了.无限循环卜去.注:char类型为一个字节,取值范围是口为,127,unsigned char 0,2553、ASSERT。是干什么用的解答:ASSERT。是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE(0),程序将报告错误,并终止执行。如果表达式不为0,
19、则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n 在程序中不应该为0,如果为0 可能导致错误,你可以这样写程序:ASSERT(n!=0);k=10/n;ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。assert。的功能类似,它是ANSI C 标准中规定的函数,它与ASSERT的一个重要区别是可以用 在 Release版本中。4、头文件中的ifndefYdeflne/endif干什么用?解答:防止该头文件被重复引用。5、#include 和#includc filenam
20、e.h”有什么区别?解答:对于#include filename.h,编译器从标准库路径开始搜索filename.h对于#include filename.h”,编译器从用户的工作路径开始搜索filename.h6 const有什么用途?(请至少说明两种)解答:(1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被 const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。7、在 C+程序中调用被C 编译器编译后的函数,为什么要加extern“C”?解答:C+语言支持函数重载,C 语言不支持函数重载。函数被C+编译后在库中的名字与 C 语
21、言的不同。假设某个函数的原型为:void fbo(int x,int y);该函数被C 编译器编译后在库中的名字为一fo。,而 C+编译器则会产生像_fdo_int_int之类的名字。C+提供了 C 连接交换指定符号extem“C”来解决名字匹配问题。8、void GetMemory(char*p)p=(char*)malloc(100);)void Test(void)char*str=NULL;GetMemory(str);strcpy(str,hello world);printf(str);请问运行T est函数会有什么样的结果?解答:程序崩溃。因为GetMemory并不能传递动态内存
22、,T est函数中的str 一直 都 是 NULL。strcpy(str,Hhello world);将使程序崩溃。9、char*GetMcinory(void)char p=hello world11;return p;)void Test(void)(char*str=NULL;str=GctMemoryO;printfifstr);请问运行T est函数会有什么样的结果?解答:可能是乱码。因为GetMemory返回的是指向“栈内存的指针,该指针的地址不是N U LL,但其原现的内容已经被清除,新内容不可知。10 void GetMemory2(char*p,int num)(*p=(ch
23、ar*)malloc(num);)void Test(void)(char*str=NULL;GetMcinory(&str,100);strcpy(str,Hhellon);printflfstr);请问运行T est函数会有什么样的结果?解答:(1)能够输出hello(2)内存泄漏11 void Test(void)(char*str=(char*)malloc(l 00);strcpy(str,hello);free(str);if(str!=NULL)(strcpy(str,world);printfi(str);)请问运行T est函数会有什么样的结果?解答:篡改动态内存区的内容,后
24、果难以预料,非常危险。因为iYee(str);之后,s tr成为野指针,if(str!=NULL)语句不起作用。12、1.下面的代码错在哪里?#includechar*Func(void)char p10;strcpy(p,ll);return p;解答:局部变量不能作为地址指针返回。13、5、请描述软件工程中的瀑布模型?解答:五、编写strcpy函 数(1 0 分)已知strcpy函数的原型是char*strcpy(char*strDest,const char*strSrc);其中strDcst是目的字符串,strSrc是源字符串。(1)不调用C+/C的字符串库函数,请编写函数strcpy
25、char*strcpy(char*strDest,const char*strSrc);assert(strDest!=NULL)&(strSrc!=NULL);/2 分char*address=strDest;2 分while(*strDest+4-=*strSrc-H-)!=0)2 分NULL;return address;2 分|六、编写用C 语言实现的求n 阶阶乘问题的递归算法:long int fect(int n)(int x;long int y;if(n0)(printf(,error!n);)if(n=0)return 1;x=n-l;y=fact(x);return(n*y
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 公司 笔试 嵌入式 16 语言 试题
限制150内