




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面试模拟题1 (C)面试题1:用find写出查找/opt/kernel目录下(包括子目录)文件名为Kconfig的命令。cd /opt/kernel/; find -name Kconfig 或 find /opt/kernel -name Kconfig面试题2:用Vi编译器底行命令模式实现字符串替换,把当前文件中的 “xiaodai ” 全部替换成 “ banzhang” 。:%s/xiaodai/banzhang/g面试题3:变量的声明和定义有什么区别?为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入 extern修饰的是变
2、量的声明,说明此变量将在文 件以外或在文件后面部分定义。说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间,如外部变量。面试题4: sizeof是库函数吗? sizeof 和strlen 的区别?sizeof是一个操作符,strlen是库函数。止的参数可以是数据的类型,也可以是变量,而 strlen只能以结尾为 0的字符 串作参数。编译器在编译时就计算出了sizeof的结果。而 strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而 strlen计算的是字符串实际的长度。数组做sizeof的参数不退化,传递给strlen就退
3、化为指针了。注意:有些是操作符看起来像是函数, 而有些函数名看起来又像操作符, 这类容易混淆 的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是 sizeof。面试题 5:链表和数组有什么区别数组和链表有以下几点不同:( 1 )存储形式:数组是一块连续的空间,声明时就要确定长度。链表是一块可不连续的动态空间,长度可变,每个结点要保存相邻结点指针。( 2 )数据查找:数组的线性查找速度快,查找操作直接使用偏移地址。链表需要按顺序检索结点,效率低。( 3 )数据插入或删除:链表可以快速插入和删除结点,而数组则可能需要大量数据移动。( 4 )越界问
4、题:链表不存在越界问题,数组有越界问题。说明: 在选择数组或链表数据结构时,一定要根据实际需要进行选择。 数组便于查询, 链表便于插入删除。数组节省空间但是长度固定,链表虽然变长但是占了更多的存储空间。面试题6:简述队列和栈的异同队列和栈都是线性存储结构, 但是两者的插入和删除数据的操作不同, 队列是 “先进先 出” ,栈是“后进先出” 。注意:区别栈区和堆区。堆区的存取是“顺序随意” ,而栈区是“后进先出” 。栈由编译器自动分配释放, 存放函数的参数值, 局部变量的值等。 其操作方式类似于数据结构中的栈。堆一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。分配方式类似于链
5、表。 它与本题中的堆和栈是两回事。 堆栈只是一种数据结构, 而堆区和栈区是程序的不同内存存储区域。面试题7:有以下语句:char a=3, b=6, c; c = aAb2;则c的二进制值是 _0x00011011。面试题8:如何打印出当前源文件的文件名以及源文件的当前行号?答案:cout _FILE_ ;cout_LINE_ ;_FILE_和_LINE_ 是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的。该函面试题9:假设某个函数的原型为:void foo( int x, int y );数分别被C编译器和C+编译器编译后在符号库中的名字是什么?答:该函数被C 编译器编译后
6、在符号库中的名字为 _foo ,而 C+ 编译器则会产生像_foo_int_int 之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“ mangled name” ) 。 _foo_int_int 这样的名字包含了函数名、函数参数数 量及类型信息,C+就是靠这种机制来实现函数重载的。面试题10:在QT程序中可以调用被 C编译器编译后的函数吗?如果可 以怎么实现?答:可以,通过加“ extern C ” 连接申明,被 extern C 修饰的变量和函数是按照C 语言方式编译和连接的面试题 11: .h 头文件中的 ifndef/define/endif 的作用
7、? i nclude 与 i nclude file.h 的区别?答: 1. 防止该头文件被重复引用。2. 前者是从 Standard Library 的路径寻找和引用 file.h , 而后者是从当前工作路径搜寻并 引用 file.h 。面试题12:结构与联合有和区别?答: 1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻 , 联合中只存放了一个被选中的成员(所有成员共用一块地址空间) , 而结构的所有成员都存在(不同成员的存放地址不同) 。2. 对于联合的不同成员赋值, 将会对其它成员重写 , 原来成员的值就不存在了 , 而对于结构的不同成员赋值是互不影响的。面试题13
8、:全局变量和局部变量可否同名,他们是否有区别?如果有,是什么区别?答:可以同名,从生命周期来说全局变量存活于整个程序运行周期,而局部变量只存在所在函数的运行周期, 当函数返回后, 局部变量也消失,全局变量储存在静态数据库,局部变量在堆栈。面试题 14: static 有什么用途? static 全局变量与普通的全局变量有什么区别? static 局部变量和普通局部变量有什么区别? static 函数与普通函数有什么区别?答:1) 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外) ,一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其
9、它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。全局变量(外部变量)的说明之前再冠以 static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源
10、文件内, 只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。 把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。 static 函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static) ,内部函数应该在当前源文件中说明和 定义。对于可在当前源文件以外使用的函数, 应该在一个头文件中说明, 要使用这些函数的源文件要包含这个头文件 static 全局变量与普通的全局变量有什么区别: static 全局变量只初使化一次,防止在其他文件单
11、元中被引用 ; static 局部变量和普通局部变量有什么区别: static 局部变量只被初始化一次,下一次依据上一次结果值; static 函数与普通函数有什么区别: static 函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝面试题 15: 什么是预编译, 何时需要预编译?预编译又称为预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include 包含的文件代码, #define 宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。c 编译系统在对程序进
12、行通常的编译之前,先进行预处理。 c 提供的预处理功能主要有以下三种: 1)宏定义 2)文件包含 3)条件编译1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。则 a01 的值为面试题16:有数组定义int a22=1,2,3;多少?。a01 的值为 0面试题17:请计算sizeof 的值char str = “ Hello ; ”char *p = str ;int n = 10;请计算sizeof (str ) =_6_sizeof ( p ) =_4_sizeof ( n )
13、 =_4_void Func ( char str100)请计算 sizeof( str ) =4void *p = malloc( 100 ); 请计算 sizeof ( p ) =4char *str=“ Hello ” “, ” x0H” I ”,;请计算:sizeof(str) =12sizeof(str0) =4面试题18:头文件中有如下宏定义,#define DECLARE_TASKLET(name, func, data) struct tasklet_struct name = NULL, 0, ATOMIC_INIT(0), func, data .c 源文件中有如下语句,s
14、tatic DECLARE_TASKLET(btn_tasklet,btn_tasklet_func,(unsigned long)&mydata);请写出预编译后,该语句展开的结果 .static struct tasklet_struct btn_tasklet = NULL, 0, ATOMIC_INIT(0), btn_tasklet_func, ( unsigned long)&mydata ;面试题19:写一个程序,以递归方式反序输出一个字符串。如给定字符串“abc”输出“cba ”。#includevoid reverse(char *p)if( *p =0)return;rev
15、erse(p+1);printf( “ %c” ,*p);int main()reverse( “ abc ” );printf( n “” );return 0;面试题20:对于一个字节(8bit) 的无符号整形变量,求二进制表示中“ 1 ”的个数,要求算法执行效率尽可能地高。先看看我自己的答案(方法一) : unsigned char Count(unsigned char byt)unsigned char num=0;while (byt)num += (byt & 0 01);byt = 1;return num;不管有多少个1 都要循环 8 次,执行效率不高,但是执行该函数的时间每
16、次都是确定的。方法二:直接的方法就是除以 2 向右移位, 逐个统计,但是用到取模和相除,这个很耗资源。int Count(BYTE v)int num=0;while (v)if (v%2=1)num+;v=v/2;return num;求余、除法很耗资源,写程序时应慎用。方法三:使用位操作,但是只会去统计1 的个数,循环的次数是BYTE 中 1 的个数,无需遍历。int Count(BYTE v)int num=0;while (v)v &=(v-1); /v=v&(v-1) 这个操作可以直接消除掉v 中的最右边的 1。num+;return num;循环次数与Byte 中 1 的个数有关,
17、但是函数执行时间不确定,不过效率比前面的要提高了很多,是不是以为这就是最佳答案了吧,告诉你: NO 。方法四:查表法,这个的效率应该是最高的了 空间换时间。将0255 各个数中所含的 1 列出来,查表! !int countTable256=0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4
18、,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7
19、,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8;int Count(BYTE v)return countTablev;这个程序要求效率尽可能的高, 显然最后一种的时间复杂度最低了 O(1). 执行时间也是确定的。 空间换时间在某些情况下是个好的选择, 比如需要频繁使用这个算法的时候,但也不是尽然,还是得视情况而定。面试题 21:参数传递有哪些形式?寄存器和堆栈传递各有什么优缺点 ?【考点】编译优化、调用性能、接口设计。答案: 每种体系结构及对应的编译器对参数传递都有自己的规定。 参数传递并非总是通过堆栈进行的, 参数入栈出栈是需要耗费时间的, 编译器总是尽量优化利用寄存器来
20、 传递参数,因为寄存器的访问效率要高, 但当参数过多时, 将放弃优化从而用栈传递参数。 因此为了提高调用性能,应尽量减少参数个数,太多时可以将所有参数重新定义为一个结构体,利用结构体指针来传递参数。 在函数接口设计时应考虑硬件平台和编译器的特性, 以灵活定义参数形式面试题 22: Define 宏语句和 inline 函数有什么区别?【考点】时空效率及宏的副作用。答: 嵌入式系统平台通常存储资源有限, 但同时又对实时性有一定的要求, 二者如何权衡需要考虑。 Define 宏语句相对于函数调用能提高运行时间性能,但消耗了 空间,并且不标准的宏语句定义在不标准的编码中更容易出现副作用, 因此 in
21、line 函数则是 define 语句的完美替代品。小资金干大事正是嵌入式的终极 目标!面试题 23: char a54 , a 的地址为0,问printf(“ %d”,a4+3 )值答案: 15面试题24:编写一个宏,实现判断数组 a 元素的个数。#define CNT( a ) sizeof(a)/sizeof(*a)面试题25: .#defineDOUBLE(x)x+x , i = 5*DOUBLE(5);i 是多少?答案: i 为 30。面试题 26: i+ 一下代码的输出结果是?int i = 1;int j = 2;int k = i+j;cout k 6) puts( 6) :
22、puts(6” 。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此 -20 变成了一个非常大的正整数, 所以该表达式计算出的结果大于6。 这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。面试题28:关于动态申请内存的问题void GetMemory(char *p)p = (char *)malloc(100);void Test(void)char *str = NULL;GetMemory(str);strcpy(str, hello world);printf(str);请问运行 Test 函数会有什么样的结果?传入 GetMemo
23、ry( char *p )函数的形参为字符串指针, 在函数内部修改形参并不能真正的改变传入形参的值, 执行完 char *str = NULL; GetMemory( str ); 后的 str 仍然为 NULL ;面试题29:请问运行Test 函数会有什么样的结果?char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);可能是乱码。char p口 = hello world;return p; p口数组为函数内的局部自动变量
24、,在函数返回后, 内存已经被释放。 这是许多程序员常犯的错误, 其根源在于不理解变量的生存期。面试题 30:请问运行Test 函数会有什么样的结果?void GetMemory2(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello);printf(str);能够输出hello , Test 函数中也未对malloc 的内存进行释放。 GetMemory 避免了以上问题,传入 GetMemory 的参数为字符串指针的指针,但
25、是在 GetMemory 中执行申请内存及赋值语句 *p = (char *) malloc( num ); 后未判断内存是否申请成功,应加上:if ( *p = NULL )./进行申请内存失败处理面试题 31:请问运行Test 函数会有什么样的结果?void Test(void)char *str = (char *) malloc(100);strcpy(str, “ hello ” );free(str);if(str != NULL)strcpy(str, “ world ” );printf(str);运行成功,输出可能是乱码, char *str = (char *) mallo
26、c(100); 后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:str= NULL;面试题 32:用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) . #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)2) . 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。3) . 意识到这个表达
27、式将使一个16 位机的整型数溢出-因此要用到长整型符号L, 告诉编译器这个常数是的长整型数。4) . 如果你在你的表达式中用到 UL (表示无符号长整型) ,那么你有了一个好的起点。记住,第一印象很重要面试题 33: C 语言中结构化程序设计的三种基本控制结构顺序结构选择结构循环结构面试题34:请说出const 与#define相比,有何优点?Const作用:定义常量、修饰函数参数、修饰函数返回值三个作用。被Const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 1) const 常量有数据类型, 而宏常量没有数据类型。 编译器可以对前者进行类型安全检查。 而对后者只进行
28、字符替换, 没有类型安全检查, 并且在字符替换可能会产生意料不到的错误。 2)有些集成化的调试工具可以对const 常量进行调试,但是不能对宏常量进行调试。面试题35:简述数组与指针的区别?数组要么在静态存储区被创建(如全局数组) ,要么在栈上被创建。指针可以随时指向任意 类型的内存块。 (1)修改内容上的差别 char a =“ hello ”;a0 = X;char *p =“ world ” ; / 注意 p 指向常量字符串p0 = X ; / 编译器不能发现该错误,运行时错误(2) 用运算符 sizeof 可以计算出数组的容量 (字节数) 。 sizeof(p),p 为指针得到的是一个
29、指针变量的字节数,而不是p 所指的内存容量。 C+/C 语言没有办法知道指针所指的内存容量, 除非在申请内存时记住它。 注意当数组作为函数的参数进行传递时, 该数组自动 退化为同类型的指针。char a = hello world;char *p = a;cout sizeof(a) endl; / 12 字节cout sizeof(p) endl; / 4 字节 计算数组和指针的内存容量void Func(char a100) cout sizeof(a) endl; / 4 字节而不是100 字节面试题 36: main 函数执行完毕后,是否可能会再执行一段代码,给出说明?答案:可以,可以
30、用 _onexit 注册一个函数,它会在main 之后执行 intfn1(void), fn2(void), fn3(void), fn4 (void); void main( void ) String str(zhanglin);_onexit( fn1 );_onexit( fn2 );_onexit( fn3 );_onexit( fn4 );printf( This is executed first.n );int fn1()printf( next.n );return 0;int fn2()printf( executed );return 0;int fn3()printf( is );return 0;int fn4()printf( This );return 0;面试题37:如果编写一个标准strlen 函数对 strlen 的掌握,它没有包括字符串末尾的 0 。读者看了不同分值的 strc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 留学签证续签与延期服务合同
- 旅游度假村特色摊位租赁与休闲娱乐合同
- 产业链整合厂房租赁合同续签补充协议范本
- 高新技术产业园区厂房及场地租赁合同范本
- 车辆转让与驾驶技能培训及考试服务协议
- 大型仓储物流园区物业运营与管理合同
- 财务数据分析员劳动合同书
- 叉车操作员技能考核与晋升合同
- 采棉机智能化改造与运营维护合同
- 社区车辆无偿租赁管理公约
- 电子胎心监护应用专家共识解读
- 超标准洪水应急预案
- 2025湖南中考:英语必背知识点
- 2025年内蒙古自治区呼和浩特市中考二模英语试题 (含答案无听力音频及原文)
- 2025-2030中国智能助听器行业市场发展趋势与前景展望战略研究报告
- 别墅的施工合同范本
- 食盐安全追溯管理制度
- 食堂餐厅就餐管理制度
- 辅导员考试题型及出题趋势试题及答案
- 2025-2030中国移动球幕影院行业市场现状分析及竞争格局与投资发展研究报告
- 2025湖北省安全员考试题库附答案
评论
0/150
提交评论