嵌入式linux工程师面试标题标题C言语底子部分



作者: 5trnga  出自: http://www.linuxdiyf.com
在网上看到了一篇嵌入式的面试题,遽然以为自己很伟大……在将来一段年华内我会继承贴上我的谜底,当然大约有些我做不出来,做出来的也不消定精确,在检验和前进自己的同时,进展有走过路过高人指点一二。

下面的标题标题必需全数答对才给分:
1、 若何在C中初始化一个字符数组。
2、 若何在C中为一个数组分拨空间。
3、 如何初始化一个指针数组。
4、如何定义一个有10个元素的整数型指针数组。
5、 s[10]的另外一种表达方式是什么。
6、 GCC3.2.2版本中支撑哪几种编程言语。
7、 要运用CHAR_BIT需求包孕哪个头文件。
8、 对(-1.2345)取整是多少?
9、 如何让部分变量具有全局生命期。
10、C中的常量字符串应在何时定义?
11、若何在两个.c文件中援用对方的变量。
12、运用malloc之前需求做什么筹管任务。
13、realloc函数在运用上要注重什么标题。
14、strtok函数在运用上要注重什么标题。
15、gets函数在运用上要注重什么标题。
16、C言语的词法剖析在长度规律方面接纳的是什么战略?
17、a b所示意的是什么意思?有什么标题?
18、如何定义Bool变量的TRUE和FALSE的值。
19、C言语的const的寄义是什么。在定义常量时,为什么举荐运用const,而不是#define。
20、C言语的volatile的寄义是什么。运用时会对编译器有什么示意。

这部分是ANSI C的一些标题,标题标题标条件是必需都答对,看似很变态,然则细想一下,这些都是最底子的,当然我们在运用他们的时辰会犯多么那样的错误,然则终极目的是不犯错误,不是么,那么好,从最底子的最先。



1、 若何在C中初始化一个字符数组。
这个标题看似很复杂大,然则我们要将最复杂大的标题用最严谨的态度来看待。环节的中间:初始化、字符型、数组。最复杂大的方式是char array[];。这个标题看似管理了,然则在初始化上好像还欠缺陷什么,小我以为:char array[5]={'1','2','3','4','5'};或许char array[5]={"12345"};或许char array[2][10]={"China","Beijing"};大约更切合“初始化”的意思。



2、 若何在C中为一个数组分拨空间。
最复杂大的方式是:char array[5];意思是分拨给数组array一个5个字节的空间。然则我们要晓得在C中数组其实就是一个名字,其本色寄义就是指针,比如char array[];是究竟分拨的多少空间?所以我们要将其分红为两种差其它方式给出谜底:
一种是栈的方式:char array[5];
一种是堆的方式:char *array; array=(char *)malloc(5);//C : array=new char[5];
堆和栈的寄义其实我也没弄太透彻,改天领略了再发一篇。
我们要领略的是,第一种方式空间分拨的大大小大约会受利用体系的限定,比如windows会限定在2M;第二种方式成空间分拨很天真,想分拨多少分拨多少,只需RAM够大大。



3、 如何初始化一个指针数组。
起首领略一个观点,就是指向数组的指针,和存放指针的数组。
指向数组的指针:char (*array)[5];寄义是一个指向存放5个字符的数组的指针。
存放指针的数组:char *array[5];寄义是一个数组中存放了5个指向字符型数据的指针。
按照题意,我大白为初始化一个存放指针的数组,char *array[2]={"China","Beijing"};其寄义是初始化了一个有两个指向字符型数据的指针的数组,这两个指针辨别指向字符串"China"和"Beijing"。



4、如何定义一个有10个元素的整数型指针数组。
既然只是定义而不是初始化,那就很复杂大且没有争议了:int *array[10];。



5、 s[10]的另外一种表达方式是什么。
背面说过了,数组和指针其实是数据存在形状的两种浮现方式,如果说关于数组s[],我们晓得*s=s[0],那么s[10]的另一种表达方式就是:*(s 10)。



6、 GCC3.2.2版本中支撑哪几种编程言语。
这个标题真实变态,就像问你#error的感化是什么一样。不能否定,gcc是linux下一个亮点,是一个备受有数步骤员推许的编译器,其优点省略1000字,有兴味可以自己查,我翻了翻书,书上曰:支撑C,C ,Java,Obj-C,Ada,Fortran,Pascal,Modula-3等言语,这个“等”竞赛要命,不外我以为已经很全了,如果以为还是不全,爽性把ASM也加上算了,不外那已经不算是编译了。



7、 要运用CHAR_BIT需求包孕哪个头文件。
如果联合下面的标题,答题的人估量会以为自己撞鬼了,这个标题真实是……搜刮了一下,应该是limits.h。



8、 对(-1.2345)取整是多少?
其实差其它取整函数大约有差其它结果,不外这个数没有太大大的争议,谜底是-1。



9、 如何让部分变量具有全局生命期。
注重的生命期的观点我以为我还要好好深入的进修一下,然则这个标题标题还算竞赛复杂大,即用static润色就可以了,然则只是生命期迟误,领域并没有扩展大,除非把这个变量定义在函数体外的静态区,不外那样就变成全局变量了,似乎不切合标题标题要求。



10、C中的常量字符串应在何时定义?
这个标题说真话不是很大白题干的意思,据我大白,有两种天气,一种是预处置处罚阶段,用#define定义;另有就是运用const润色词,不外const润色的是一个变量,其寄义是“只读”,称之为常量并不精确,然则真实其实可以用利用变量的方式当常量用。所以还是第一种竞赛靠谱。



11、若何在两个.c文件中援用对方的变量。
这个标题也问的挺暗昧的,怎样说呢,最复杂大最间接的方式是为变量添加extern润色词,当然,这个变量必需是全局变量。另有一种就是利用函数挪用来终止变量的间接援用,比如这个C文件中的一个函数援用另外一个C中的函数,将变量颠末实参的方式传递曩昔。不外标题标题既然说是援用,那么还是用第一个谜底好了。



12、运用malloc之前需求做什么筹管任务。
其实筹管任务很多啊,比如你需求一台打定机之类的。玩笑话,我们起首要晓得malloc的用处,复杂大的说就是静态的分拨一段空间,前往这段空间的头指针。理论的筹管任务可以这么分:需求这段空间的指针能否存在,若不存在,则定义一个指针用来被赋值,还要领略要前往一个什么范例的指针,分拨的空间能否公正;如果指针已经存在,那么在重新将新的空间头地点赋值给这个指针之前,要先判别指针能否为NULL,如果不是要free一下,否则副本的空间就会被浪掷,或许犯错,free之后就按照前一种天气思量就可以了。



13、realloc函数在运用上要注重什么标题。
这个函数我也才晓得的,汗一个。据我的初步大白,这个函数的感化是重新分拨空间大大小,前往的头指针不乱,只是转变空间大大小。既然是转变,就有变大大、变小和为什么转变的标题。变大大,要注重不能大大到内存溢出;变小,那变小的那部分空间会被征用,原有数据不再存在;为什么转变,如果是想重新挪作他用,还是先free了吧。



14、strtok函数在运用上要注重什么标题。
这个标题我不晓得能不能复兴双方面,由于真实是用的很少。这个函数的感化是瓜分字符串,然则要瓜分的字符串不能是常量,这是要注重的。比如先定义一个字符串:char array[]="part1,part2";,strtok的原形是char *strtok(char *string, char *delim);,我们将","作为分阻隔断疏散符,先用pt=strtok(array,",");,失丢失的结果print出来就是"part1",那背面的呢,要写成pt=strtok(NULL,",");,注重,要用NULL,如果被瓜分的字符串会被分红N段,那从第二次最先就不绝要用NULL。总结起来,需求注重的是:被瓜分的字符串和分阻隔断疏散符都要运用变量;除第一次运用指向字符串的指针外,之后的都要运用NULL;注重运用这个函数的时辰千万别把指针跟丢了,否则就全乱了。



15、gets函数在运用上要注重什么标题。
这是一个键盘输入函数,将输入字符串的头地点前往。说到要注重的标题,我还是先查了一下网上的一些天气,需求注重的就是gets以输入回车结束,这个地球人都晓得,然则很多人不晓得的是,当你输入完一个字符串后,这个字符串大约依然存在于这个尺度输入流之中,当再次运用gets的时辰,大约会把上次输入的器械读出来,所以应该在运用之后用fflush(stdin);处置处罚一下,将输入流清空。着末也还是要注重溢出的标题。关于这个谜底我竞赛暗昧,不晓得有没有高人卓见?



16、C言语的词法剖析在长度规律方面接纳的是什么战略?
我无语……闻所未闻啊……还是搜刮了一下,有一篇文章,地点是:http://202.117.80.9/jp2005/20/kcwz/wlkc/wlkc/03/3_5_2.htm,是关于词法剖析器的。此中提到了两点战略: (1) 按最长匹配准绳确定被选的词型;(2) 如果一个字符串能为多少个词型匹配,则胪列在最背面的词型被选中。不晓得是不是题干的要求,还是其他什么。我乃一介草民,望达人指点迷津!



17、a b所示意的是什么意思?有什么标题?
这个器械(称之为器械一点都不太过)其实并没有语法错误,按照C对运算符品级的分别, 的优先级大大于 ,那么这句话会被编译器看做:(a ) ( b),这回领略了吧。有什么标题,语法上没有标题,有的是德行上的标题!作为一个出色的步骤员,我们要力图语句的公正性和可读性,如果写这句的人是在一个team里,那么他基本会被打的半死……着末批评争吵一下结果:假定a之前的值是3,b是4,那么运转完这个变态语句后,a的值是4,b是5,语句的结果是8。



18、如何定义Bool变量的TRUE和FALSE的值。
不晓得这个题有什么骗局,写到现在神经已经大大了,普通来说先要把TURE和FALSE给定义了,运用#define就可以:
#define TURE 1
#define FALSE 0
如果有一个变量需求定义成bool型的,举个例子:bool a=TURE;就可以了。



19、C言语的const的寄义是什么。在定义常量时,为什么举荐运用const,而不是#define。
起首,这个题干抽了10题复兴的一个大大嘴巴。关于常量的观点看来我要好顺眼看书了……我说过了,const润色词可以将一个变量润色为“只读”,这个就能称为常量么?且则以为可以。回到标题标题中,const是只读的意思,它限定一个变量不允许被转变,谁都不能改!既然是润色变量,那么变量的范例就可以厚实多彩,int啊,char啊,只需C看法的都可以;然则#define就弗成以了,在预处置处罚阶段缺乏范例检测机制,有大约会犯错。另有就是变量可以extern,然则#define就弗成以。貌似const还可以节约RAM,这个我倒是没有考证过。至于const的用法和感化,有很多,我会总结后发下去。



20、C言语的volatile的寄义是什么。运用时会对编译器有什么示意。
终于着末一题了,轻易么……如果这个测试是一个关于嵌入式的,那么这道题迥殊异常首要!!从词面上讲,volatile的意思是易变的,也就是说,在步骤运转过程中,有一些变量大约会被莫明其妙的转变,而优化器为了浪掷年华,偶然候不会重读这个变量的真实值,而是去读在存放器的备份,多么的话,这个变量的真实值反而被优化器给“优化”丢失了,用时兴的词说就是被“谐和”了。如果运用了这个润色词,就是看护编译器别犯懒,老诚实实去重新读一遍!大约我说的太“普通”了,那么我援用一下“大大家”的尺度解释:
volatile的本意是“易变的” 。
由于会见存放器的速度要快过RAM,所以编译器普通都邑作添加存取外部RAM的优化,但有大约会读脏数据。当要求运用volatile 声明的变量的值的时辰,体系老是重新从它所在的内存读取数据,即便它背面的指令方才从该处读取过数据。而且读取的数据即刻被生存。
精确地说就是,优化器在用到这个变量时必需每次都警惕地重新读取这个变量的值,而不是运用生存在存放器里的备份。
下面是volatile变量的几个例子:
1). 并行设置装备摆设的硬件存放器(如:形态存放器)
2). 一此中缀效力子步骤中会会见到的非自动变量(Non-automatic variables)
3). 多线程运用中被几个任务共享的变量
嵌入式体系步骤员屡屡同硬件、中缀、RTOS等等打交道,所用这些都要求volatile变量。不晓畅volatile内容将会带来灾祸。





版权声明: 原创作品,允许转载,转载时请务必以超链接方式标明文章 原始来由 、作者信息和本声明。否则将清查法律责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1976014.html