嵌入式linux工程师面试题目C语言基础部分 (2

嵌入式软件工程师经典面试题(附答案)(二) 一、基本介绍 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功能。 嵌入式软件工程师就是编写嵌入式系统的工程师。 二、职业要求 应具备哪些能力 1.最重要的是C语言编程,以及C++,这个与你读程,应用,开发项目,做系统移植息息相关; 2.操作系统: LINUX,WINC... 阅读详情

嵌入式linux工程师面试题目C语言基础部分

在网上看到了一篇嵌入式的面试题,忽然觉得自己很渺小……在未来一段时间内我会陆续贴上我的答案,当然可能有些我做不出来,做出来的也不一定准确,在检验和提高自己的同时,希望有走过路过高人指点一二。

下面的题目必须全部答对才给分:
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内容将会带来灾难。

嵌入式工程师面试题汇总(应届、转行) 面试题汇总 一 . C基础 gcc编译器编译的完整流程,分别有什么作用? 答:预处理、编译、汇编、链接。预处理:头文件的展开/宏的替换/去掉注释/条件编译。编译:检查语法,生成汇编。汇编:汇编代码转换成机器码。链接:链接到一起生成可执行文件。 什么是回调函数? 答: 回调函数是一段可执行的代码段,它作为一个参数传递给其他的代码,其作用是在需要的时候方便调用这段(回调函数)代码。 地址能否使用printf函数中的 %u形式打印? 答:不能。 无论是不是unsigned,内存中存储的char类型的值 阅读详情

相关推荐

嵌入式常见面试问题汇总(转载)

进程是资源(CPU、内存等)分配的基本单位,线程是CPU调度和分配的基本单位(程序执行的最小单位)。同一时间,如果CPU是单核,只有一个进程在执行,所谓的并发执行,也是顺序执行,只不过由于切换速度太快,你以为这些进程在同步执行而已。多核CPU可以同一时间点有多个进程在执行。你可以有很多角度,有进程上下文,有中断上下文。

lazycat_yang的博客 5089

经典嵌入式linux面试

1,统计字符串当中最长子字符串,并打印输出。(未解决) 2,统计一个数当中,1的个数。 3,统计一个字符串当中,某个字符的个数、 4,在下面这个程序片段中的划线处填上适当的表达式,使之逆序输出数组元素。      --------------------------------------------------------------------------------

L_yangliu的专栏 1228

嵌入式面试2022嵌入式经典面试题汇总(Linux | 文件IO)

2022年秋招我面试嵌入式MCU开发方向,经过了多场的笔试与面试,在准备的过程中看了非常多的资料,我的汇总的笔记一直写在有道云笔记中,没有分享出来。现在已经到了23年春招了,特此整理后分享出来。资料看过了觉得不错就保存下来了,如果有不对的地方,欢迎批评指正,侵权联删!

一位才工作的工程师,持续学习,持续输出。更多内容,关注公众号“不想脱发的基兄”。 4148

嵌入式linux面试题分享

以下是一些嵌入式Linux面试题,并附有答案:题目:什么是嵌入式Linux?答案:嵌入式Linux是一种针对嵌入式系统的Linux操作系统。它具有轻量级、可定制和可扩展性强的特点,适用于各种嵌入式设备,如智能家居、工业控制、医疗设备等。题目嵌入式Linux与普通Linux有什么区别?答案:嵌入式Linux与普通Linux的主要区别在于其针对性和优化。嵌入式Linux针对特定的硬件平台进行优化,以减少内存占用和提高性能。

ajunbin859的专栏 1862

嵌入式面试题目汇总之经典

因为tcp传输的数据满足3大条件,不丢失,不重复,按顺序到达。

嵌入式技术开发 4398

嵌入式面试常见问题及答案

答:首先单片机中断处理有三个部分,第一个部分是中断响应,第二个中断处理,第三个中断返回,然后具体的过程是首先中断系统通过硬件自动生成长调用指令(LACLL),该指令将自动把断点地址压入堆栈保护,然后将对应的中断入口地址装入程序计数器PC,使程序转向该中断入口地址,执行中断服务程序。该指令的功能是把断点地址从堆栈中弹出,返回到程序计数器PC,此外,还通知中断系统已完成中断处理,并清楚优先级状态触发器。答:存储内容不同,管理方式不同,空间大小不同,能否产生碎片不同,生长方向不同,分配方式不同,分配效率不同。

weixin_57194914的博客 3751

嵌入式面试题(linux

当一个进程被调度器调度时,操作系统会将进程的上下文保存到进程控制块(PCB)中,然后加载到内存中的适当位置,以便处理器可以正确地执行该进程。在操作系统方面,一些操作系统可能会限制进程可以创建的最大线程数,例如,在一些嵌入式操作系统中,可能只允许创建几个线程。线程的调度由操作系统负责,当一个线程完成了一次调度后,它将返回自己的进程空间,从而执行该进程的其他线程。子进程的内存空间是父进程内存空间的一个副本,当父进程修改了某个内存地址上的数据后,子进程在同样的内存地址上的数据也会发生改变。

qq_52940414的博客 2659

嵌入式软件工程师笔试面试指南目录

嵌入式软件笔试,嵌入式软件面试,程序员简历书写,Linux驱动工程师笔试,Linux驱动工程师面试,BSP工程师笔试,BSP工程师面试,应届生秋招,应届生春招,C/C++笔试题目,C/C++面试题目,C/C++程序员,BSP工程师

嵌入式与Linux那些事的博客 1万+

嵌入式工程师面试题集汇总

请自我介绍? 为什么不留在xx公司(为啥离职)? 你5-10年职业规划是怎样的? 你还写代码吗?从工程师到管理再到工程师你是怎样想的或能承受吗 把你的以前工作简单介绍一下? 介绍你在xxx公司(或实习单位)负责的内容或职责?前一家公司写过代码? 介绍最成功的一个项目?或让你有成就感的项目? 介绍最有挑战性的一个项目? 讲一下xxx量产项目? 介绍xx项目(简历中提到的项目)?分别介绍这几个项目该项目如何分工的? 这个项目的需求是什么? 你在该项目中做啥? 都是你一个人做的? 该项目中遇到了什么困难?如何解决

5895

嵌入式linux工程师面试题目C语言基础部分

<br />嵌入式linux工程师面试题目C语言基础部分<br />在网上看到了一篇嵌入式面试题,忽然觉得自己很渺小……在未来一段时间内我会陆续贴上我的答案,当然可能有些我做不出来,做出来的也不一定准确,在检验和提高自己的同时,希望有走过路过高人指点一二。<br />下面的题目必须全部答对才给分:<br />1、 如何在 C中初始化一个字符数组。<br />2、 如何在 C中为一个数组分配空间。<br />3、 如何初始化一个指针数组。<br />4、如何定义一个有10个元素的整数型指针数组。<br />

QQ124366460的专栏 429

嵌入式软件开发工程师面试指南_总结

struct ages { int age1; int age2; int age3; }; struct ages age; 分析总结:在这个示例中,数组比结构体好。但是不能得出结论数组比结构体好,在元素类型不同时只能使用结构体而不能使用数组。 struct pople { int age; //年龄 int name[20]; //姓名 int height; //身高 }; struct ages age; ...

子羽丿_的博客 9319

嵌入式linux工程师面试题目

1. C++中如何阻止一个类被实例化?2. 一般在什么时候构造函数被声明成private呢?3. 什么时候编译器会生成默认的copy constructor呢?4. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?5. struct和class有什么区别?答:默认的访问级别不同,struct是public,class是private6. 没有别的不同了吗?7. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?8. inline的函数和#define有什么区别

njdy_2008的专栏 1066

小米嵌入式工程师面试-心得

小米Linux嵌入式C工程师面试-心得 前言:今年有幸参加小米的面试和笔试,大学刚毕业那一会儿,特别想进小米,但是投的简历都打水漂了,估计网申没过把。想进小米,主要因为个人原因,我的第一部智能手机就是小米2,后来用小米4、小米5,可以说这是最初的梦想吧。 面试流程:网上投简历,通过网申,安排线下面试,项目提问,基础知识掌握程度,笔试 面试地点:小米科技园 项目问答部分: 1、问的很详细,每一个项目都会逐一问答,不过这些都可以说流畅的讲出项目的架构和原理,不过具体太深的地方就有点力不从心了,面试官会一直往

weixin_43269452的博客 6392

【笔试题】2019海康威视嵌入式软件开发工程师(BSP)笔试题(附超详细解答)

海康威视嵌入式软件工程师题目只包含两个部分选择题和简答题,也就是说,没有编程题! 照样是C语言基础的题量最多了,又因为是BSP方向,所以关于Linux操作系统和驱动方面的题目可能页会比较多一点,但是就题目的总体难度而言,也并不是特别难。但如果对Linux、驱动方面不是很了解的话,估计会很吃亏的。 选择题 1、若有8个待排序元素,采用冒泡排序和插入排序最大时间复杂度分别是()。 64...

Yngz_Miao的博客 11万+

嵌入式面试常见问题(六)—各大公司面试

大公司面试注重基础,小公司面试注重项目和实战。 1、阿里面试 阿里面试总结,岗位:阿里云网络产品研发实习生。 1、Linux系统方面 1)进程和线程的区别(不能太书面化)(需要从内存角度,或者其他角度描述) 需要用自己理解的方式去回答这个问题,如果你回答了xxx是基本单位,这样子是不行的。技术面试会追问你,需要你用自己的话去理解进程和线程。线程和进程是否是独立的?线程和进程的之间内存空间是否是共享的?进程和进程之间是否是共享的? 2)线程之间是如何调度的 比如说有两个线程:线程A和线程B,线程B要先于线程A

梅山 1万+

嵌入式面试题整理(一)

自己整理了一些来自各个公司嵌入式行业的面试题目。答案在后面(是自己写的答案,不敢保证100%正确,哈哈,能力有限)。题目都是近两年的公司面试题   关键字volatile有什么含义?并列举一个例子。 嵌入式系统总是要用户变量或寄存器进行位操作。给定一个整变量a,写两段代码,第一个设置a的bit 3,第二个清零a的bit3。在以上两个操作中,要保持其它位不变。 嵌入式系统经常具有要求程序员...

qq_36260510的博客 2535

嵌入式linux面试问题大全

1.C语言代码的设计模式有哪些?是什么?2.Linux内存子系统了解吗?讲讲。3.linux中的线程一般是怎么调度的?如果现在是一个单核的CPU,那么多个线程是按什么顺序去运行的?也就是线程的系统调度。4.驱动中poll、中断、异步机制的实现原理,详细讲解poll、select、epoll再内核层面的实现原理5.线程池、进程间通信的一些基础。6.了解coredump吗?他的底层实现是什么?7.mmap的原理和实现。8.OTA是你自己设计的吗?你讲讲怎么设计一个OTA流程。

weixin_52049843的博客 1244

嵌入式经典面试30题(附带答案)

因为STM32拥有丰富的外设资源,不同外设使用的时钟也会不一样,同时我们要知道时钟越快,功耗就越大,抗电磁干扰的能力就会减弱,因此,比较复杂的MCU 都会采用多时钟来解决这些问题。4、模拟输入,这个我没用到,也不太理解,套用一下前辈的话:模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0,1的二进制数字信号,通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。6、推挽输出:配置后,输出1,PMOS管接通,外输出高点平,输出0,NMOS管接通,外输出低电平,输出1.

qq_64698093的博客 1744
上一篇: 嵌入式工程师笔试题目汇总
下一篇: 嵌入式工程师笔试面试题目
edward0004
博客等级 码龄15年 65粉丝 57原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值