嵌入式面试技巧

篇一:嵌入式系统面试的几个问题

嵌入

式程序员应知道的几个基本问题

文章来源:

chinaunix 作者:nigel jo„ 更新时间:2007-2-3 【大 小】 【加入收藏】 c语言测试

是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种

测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开

面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度

来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ansi标准

细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ascii

值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花

时间在微机上而不是在嵌入式系统上。如果上述任何问题的答案是是的话,那么我知道我得

认真考虑我是否应该去做这份工作。

从面试者的角度来

讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者c语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智

的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的

真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我

决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点

帮助。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。

这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序

员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果

选择这些考题为你所用,请自行按你的意思分配分数。

预处理器

(preprocessor)

1 . 用预处理指令

#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define

seconds_per_year (60 * 60 * 24 * 365)ul

我在这想看到几件

事情:

1) #define 语法

的基本知识(例如:不能以分号结束,括号的使用,等等)

2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒

而不是计算出实际的值,是更清晰而没有代价的。

3) 意识到这个表

达式将使一个16位机的整型数溢出-因此要用到长整型符号l,告诉编译器这个常数是的长整

型数。

4) 如果你在你的

表达式中用到ul(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个标准宏

min ,这个宏输入两个参数并返回较小的一个。

#define min(a,b)

((a) <= (b) ? (a) : (b))

这个测试是为下面

的目的而设的:

1) 标识#define

在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准c的一部分

之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,

嵌入代码经常是必须的方法。

2)三重条件操作符

的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的代

码,了解这个用法是很重要的。

3) 懂得在宏中小

心地把参数用括号括起来

4) 我也用这个问

题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

3. 预处理器标识

#error的目的是什么?

如果你不知道答案,

请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会

读c语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试

者最好希望自己不要知道答案。

死循环(infinite

loops)

4. 嵌入式系统中

经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

{

}

一些程序员更喜欢

如下方案:

for(;;)

{

}

这个实现方式让我

为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将

用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:我被教着这样

做,但从没有想到过为什么。这会给我留下一个坏印象。第三个方案是用 goto

loop:

...

goto loop;

应试者如给出上面

的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的

basic/fortran程序员。

volatile

8. 关键字

volatile有什么含意?并给出三个不同的例子。

一个定义为

volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变

量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的

值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬

件寄存器(如:状态寄存器)

2) 一个中断服务

子程序中会访问到的非自动变量(non-automatic variables)

3) 多线程应用中

被几个任务共享的变量

回答不出这个问题

的人是不会被雇佣的。我认为这是区分c程序员和嵌入式系统程序员的最基本的问题。搞嵌

入式的家伙们经常同硬件、中断、rtos等等打交道,所有这些都要求用到volatile变量。

不懂得volatile的内容将会带来灾难。

假设被面试者正确

地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正

懂得volatile完全的重要性。

1)一个参数既可以

是const还可以是volatile吗?解释为什么。

2); 一个指针可以

是volatile 吗?解释为什么。

3); 下面的函数有

什么错误:

int

square(volatile int *ptr)

{

return *ptr *

*ptr;

}

下面是答案:

1)是的。一个例子

是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不

应该试图去修改它。

2); 是的。尽管这

并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr

指向一个volatile型参数,编译器将产生类似下面的代码:

int

square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可

能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平

方值!正确的代码如下:

long

square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

位操作(bit

manipulation)

9. 嵌入式系统总

是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的

bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

篇二:嵌入式面试题

(1)

什么是预编译,何时需要预编译:

答案:

1、总是使用不经

常改动的大型代码体。

2、程序由多个模

块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所

有包含文件预编译为一个预编译头。

9、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

答案:.#define

min(x, y) ((x)>(y)?(y):(x)) //结尾没有‘;’

10、嵌入式系统中

经常要用到无限循环,你怎么用c编写死循环。

答案:while(1){}

或者for(;;)

11、关键字static

的作用是什么?

答案:定义静态变

12、关键字const

有什么含意?

答案:表示常量不

可以修改的变量。

13、关键字

volatile有什么含意?并举出三个不同的例子?

答案:提示编译器

对象的值可能在编译器未监测到的情况下改变。

17.c和c++中的

struct有什么不同?

答案:c和c++中

struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中

struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默

认为private

20.列举几种进程

的同步机制,并比较其优缺点。

答案: 原子操作

信号量机制 自旋锁 管程,会合,分布式系统

21.进程之间通信

的途径

答案:共享存储系

统消息传递系统管道:以文件系统为基础

22.进程死锁的原

答案:资源竞争及

进程推进顺序非法

23.死锁的4个必

要条件

答案:互斥、请求

保持、不可剥夺、环路

24.死锁的处理

答案:鸵鸟策略、

预防策略、避免策略、检测与解除死锁

25. 操作系统中

进程调度策略有哪几种?

答案:fcfs(先来先

服务),优先级,时间片轮转,多级反馈

26.类的静态成员

和非静态成员有何区别?

答案:类的静态成

员每个类只有一个,非静态成员每个对象一个

27.纯虚函数如何

定义?使用时应注意什么?

答案:virtual

void f()=0; 是接口,子类必须要实现

28.数组和链表的

区别

答案:数组:数据

顺序存储,固定大小连表:数据可以随机存储,大小可动态改变

29.iso的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?

答案:应用层表示

层会话层运输层网络层物理链路层物理层 tcp /udp属于运输层 tcp 服务提供了数据流传输、

可靠性、有效流控制、全双工操作和多路复用技术等。与 tcp 不同, udp 并不提供对 ip 协

议的可靠机制、流控制以及错误恢复功能等。由于 udp 比较简单, udp 头包含很少的字节,

比 tcp 负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好

udp: 不提供稳定的服务,包头小,开销小

34、线程与进程的

区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆

栈?

答案:进程是死的,

只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你

创建了一个主线程。每个线程有自己的堆栈。 dll中有没有独立的堆栈,这个问题不好回答,

或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆

栈,如果dll中的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有自己独

立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll有独立的

堆栈?以上讲的是堆栈,如果对于堆来说,每个dll有自己的堆,所以如果是从dll中动态

分配的内存,最好是从dll中删除,如果你从dll中分配内存,然后在exe中,或者另外一

个dll中删除,很有可能导致程序崩溃

4。对于一个频繁使

用的短小函数,在c语言中应用什么实现,在c++中应用什么实现?

答案:c用宏定义,

c++用inline

5。直接链接两个信

令点的一组链路称作什么?

答案:ppp点到点

连接

7。软件测试都有那

些种类?

答案:黑盒:针对

系统功能的测试 白合:测试函数功能,各函数接口

8。确定模块的功能

和模块的接口是在软件设计的那个队段完成的?

答案:概要设计阶

1、局部变量能否和

全局变量重名?

答案:能,局部会

屏蔽全局。要用全局变量,需要使用:: 局部变量可以与全局变量同名,在函数内引用这个变

量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数

内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个

局部变量的作用域就在那个循环体内

2、如何引用一个已

经定义过的全局变量?

答案:extern 可以

用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件

中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式

引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

3、全局变量可不可

以定义在可被多个.c文件包含的头文件中?为什么?

答案:可以,在不同的c文件中以static形式来声明同名全局变量。可以在不同的c文件中

声明同名的全局变量,前提是其中只能有一个c文件中对此变量赋初值,此时连接不会出错

5、do??while和

while??do有什么区别?

答案:前一个循环

一遍再判断,后一个判断以后再循环。

高级题

1、static全局变

量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函

数与普通函数有什么区别?

答案:全局变量(外

部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方

式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽

在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的

全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变

量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域

局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错

误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它

的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 static

函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函

数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函

数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局变

量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被

引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一

次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,

普通函数在每个被调用中维持一份拷贝

2、程序的局部变量

存在于()中,全局变量存在于()中,动态申请数据存在于( )中。

答案:栈;静态区;

4、队列和栈有什么

区别?

答案:队列先进先

出,栈后进先出÷

防火墙是怎么实现的?

你对哪方面编程熟

悉?

2 ipsec为什么是三层的。l2tp为什么是二层的?

答案:ipsec

(internet 协议安全)是一个工业标准网络安全协议,为 ip 网络通信提供透明的安全服务,

保护 tcp/ip 通信免遭窃听和篡改,可以有效抵御网络攻击,同时保持易用性。ipsec有两

个基本目标:1)保护ip数据包安全;2)为抵御网络攻击提供防护措施。 第三层保护的优

点 通常ipsec提供的保护

需要对系统做一定的修改。但是ipsec在ip传输层即第三层的策略执行(strategic

implementation)几乎不需要什么额外开销就可以实现为绝大多数应用系统、服务和上层协

议提供较高级别的保护;为现有的应用系统和操作系统配置ipsec几乎无须做任何修改,安

全策略可以在active directory里集中定义也可以在某台主机上进行本地化管理。 ipsec

策略在iso参考模型第三层即网络层上实施的安全保护,其范围几乎涵盖了tcp/ip协议簇中

所有ip协议和上层协议,如tcp、udp、icmp,raw(第255号协议)、甚至包括在网络层发

送数据的客户自定义协议。在第三层上提供数据安全保护的主要优点就在于:所有使用ip

协议进行数据传输的应用系统和服务都可以使用ipsec,而不必对这些应用系统和服务本身

做任何修改。 运作于第三层以上的其他一些安全机制,如安全套接层ssl,仅对知道如何

使用ssl的应用系统(如web浏览器)提供保护,这极大地限制了ssl的应用范围;而运作

于第三层以下的安全机制,如链路层加密,通常只保护了特定链路间的数据传输,而无法做

到在数据路径所经过的所有链路间提供安全保护,这使得链接层加密无法适用于 internet

或路由 intranet 方案中的端对端数据保护。 l2tp(第二层隧道协议)通过使用虚拟专用网

(vpn) 连接和第二层隧道协议 (l2tp),可以通过 internet 或其他公共网络访问专用网。

l2tp 是一个工业标准 internet 隧道协议,它和点对点隧道协议 (pptp) 的功能大致相同。

利用l2tp来构建企业的vpn,一样需要运营商支持,因为lac一般是在传统电话交换网络中

部署的,并且一个公司的分支机构以及移动办公的员工在地域上分布很广,所以需要各地的

运营商都具备lac才能够实现企业大范围构建vpn网络。当然企业也可以构建自己的基于

l2tp的vpn网络在l2tp vpn中,用户端的感觉就像是利用ppp协议直接接到了企业总部的

ppp端接设备上一样,其地址分配可以由企业通过dhcp来分配,认证方式可以沿用ppp一直

沿用的各种认证方式,并且l2tp是ietf定义的,其mib库也将定义出来从而可以实现全局

的网络管理。

3 ospf中包的ttl

值是多少?

答案:1,因为

224.0.0.5/224.0.0.6是本地链路组播

4 ospf为什么要划

分区域?

答案:rd用于bgp

区分vpn路由,rt用于在各vrf中导入或导出路由 5 mpls vpn的标签一共有几层。内网的

标签放在哪里。

答案:如果没有流

量工程则是2层,内网标签在隧道标签之后

6 mpls中rd和rt

的作用分别是什么?

答案:减少cpu负

载,区域间使用距离矢量算法,因此其它区域的泛洪不会影响区域的spf运算,这里注意面

试官可能会问ospf多区域如何防止环路。(注意答本质而不是现象,免得面试官追问)

7 rr防止环路的机

制。

答案:rr中通过

origin id和cluster id防止环路,若rr收到带有自己cluster id的路由则丢弃

8 bgp控制

out-bound用local-pre,控制进来的用med.

答案:正确

9 ospf是工作在哪个协议上的?

答案:ip,ospf协

议号89

10 ospf的lsa类

型。

答案:1,2,3,4,

5,6,7,没有什么好说的,注意考官问到第6类lsa,组播再准备多点

11 简述ospf的基

本工作机制。

答案:这个没什么

可以说了,把知道的都说出来就行了

12 ppp的lcp和

ncp协商过程。

答案:lcp过程协

商二层链路相关参数,mtu/ppp压缩/认证协议类型等~~~ncp协商第三层协议,ip地址,ip

压缩等等,这里记住最好不要说cdp 13 笔试中还有一道pstn的信令控制有哪三种?

答案:这个我只知

道随路信令和共路信令,信工同学提供的答案是:监视\号码\音信号\,知道正确答案的朋友

麻烦纠正一下

14sloari 8.0查看

进程的命令是什么?linux 7.3查看ip的命令是什么?

答案:不知道华为

为什么问这个,第一个是ps吧?第二个是ifconfig /a 15 ip是5.32.0.0,掩码255.224.0.0。

请问最大的有效地址是多少。

答案:最大主机地

址5。64。255。254

17 lx/lh的有效距

离是多少?

答案:???

18 ip 包头几个字

节?加上数据部分几个字节

答案:应该是问

ipv4,一般20字节,加上源路由选择等后最大60字节,加上数据部分还是根据链路mtu决

20 cq能不能有一

种流量dominate第二种流量?

答案:cq不能有一

种流量dominate其它任何流量 21 ftp下载一个文件完成。有几个tcp连接答案:4个

篇三:经典嵌入式面试题

经典

嵌入式面试题

c语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织

了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,

此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度

来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ansi标准

细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ascii值。

这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间

在微机上而不上在嵌入式系统上。如果上述任何问题的答案是是的话,那么我知道我得认真

考虑我是否应该去做这份工作。

从面试者的角度来

讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者c语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智

的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的

真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我

决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点

帮住。这些问题都是我这些

年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。 这个测试适于不同水平的

应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为

了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,

请自行按你的意思分配分数。

预处理器

(preprocessor)

1 . 用预处理指令

#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define

seconds_per_year (60 * 60 * 24 * 365)ul

我在这想看到几件

事情:

?; #define 语法

的基本知识(例如:不能以分号结束,括号的使用,等等)

?; 懂得预处理器

将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实

际的值,是更清晰而没有代价的。

?; 意识到这个表

达式将使一个16位机的整型数溢出-因此要用到长整型符号l,告诉编译器这个常数是的长整

型数。

?; 如果你在你的

表达式中用到ul(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个标准宏min ,这个宏输入两个参数并返回较小的一个。 #define min(a,b) ( (a)

<= (b) ? (a) : (b) )

这个测试是为下面

的目的而设的:

?; 标识#define

在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准c的一部分,

宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代

码经常是必须的方法。

?; 三重条件操作

符的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的

代码,了解这个用法是很重要的。

?; 懂得在宏中小

心地把参数用括号括起来

?; 我也用这个问

题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = min(*p++, b);

3. 预处理器标识#error的目的是什么?

#error 停止编译

并显示错误信息

如果你不知道答案,

请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会

读c语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试

者最好希望自己不要知道答案。

死循环(infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解

决方案。我首选的方案是:

while(1)

{

;}

一些程序员更喜欢

如下方案:

for(;;)

{

;}

这个实现方式让我

为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将

用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:我被教着这样

做,但从没有想到过为什么。这会给我留下一个坏印象。

第三个方案是用

goto

loop:

...

goto loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是

一个想进入新领域的basic/fortran程序员。

数据声明(data

declarations)

5. 用变量a给出

下面的定义

a) 一个整型数(an

integer) int a

b)一个指向整型数

的指针( a pointer to an integer) int *a c)一个指向指针的的指针,它指向的指针是

指向一个整型数( a pointer to a pointer to an intege)r *(int *a) int**a

d)一个有10个整

型数的数组( an array of 10 integers)int a[10] e) 一个有10个指针的数组,该指针

是指向一个整型数的。(an array of 10 pointers to integers) int *a[10]

f) 一个指向有10

个整型数数组的指针( a pointer to an array of 10 integers) *(int a[10]) int (*a)[10]

g) 一个指向函数

的指针,该函数有一个整型参数并返回一个整型数

(a pointer to a

function that takes an integer as an argument and returns an integer) fun(*int

a ) int (*max_function)(int a)

h)一个有10个指

针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( an array of ten

pointers to functions that take an integer argument and return an integer )fun(*int

a[10]) int (*a[10])(int)

篇四:嵌入式常见面试题

(2)

char * const p char const * p const char *p 上述三个有什么区别? 答案:

char * const p; //

常量指针,p的值不可以修改

char const * p;

//指向常量的指针,指向的常量值不可以改

请问以下代码有什么问题:

int main()

{

char a;

char

*str=&a;

strcpy(str,hello);

printf(str);

return 0;

}

答案:没有为str

分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽

然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

写一个“标准”宏,

这个宏输入两个参数并返回较小的一个。

答案:

#define min(x, y)

((x)>(y)?(y):(x))

//结尾没有‘;’

char* s=aaa;

printf(%s,s);

s[0]=b;

printf(%s,s);

有什么错?

答案:aaa是字符

串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。 cosnt char* s=aaa;

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

嵌入式系统中经常

要用到无限循环,你怎么用c编写死循环。

答案:while(1){}

或者for(;;)

关键字const有什么含意?

答案:表示常量不

可以修改的变量。

1、关键字static的作用是什么?

这个简单的问题很

少有人能回答完全。在c语言中,关键字static有三个明显的作用:

1). 在函数体,一

个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但

在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函

数访问。它是一个本地的全局变量。

3). 在模块内,一

个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明

它的模块的本地范围内使用。

关键字volatile有什么含意?并举出三个不同的例子?

答案:提示编译器

对象的值可能在编译器未监测到的情况下改变。

int (*s[10])(int) 表示的是什么啊?

答案:int

(*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

交换两个变量的值,

不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;

答案:有两种解法,

一种用算术算法, 一种用^(异或) a = a + b; b = a - b; a = a - b; or a = a^b;// 只能

对int,char.. b = a^b; a = a^b; or a ^= b ^= a;

static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区

别?static函数与普通函数有什么区别?

答案:全局变量(外

部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方

式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽

在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的

全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变

量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

程序的局部变量存

在于()中,全局变量存在于()中,动态申请数据存在于( )中。 答案:栈;静态区;

6、全局变量和局部

变量在内存中是否有区别?如果有,是什么区别?

答 :全局变量储存

在静态数据区,局部变量在堆栈中。

8、堆栈溢出一般是由什么原因导致的?

答 :1.没有回收垃

圾资源

2.层次太深的递归

调用

14、如何引用一个已经定义过的全局变量?

答 、可以用引用头

文件的方式,也可以用extern关键字,

4、队列和栈有什么区别?

答案:队列先进先

出,栈后进先出

3、.h头文件中的ifndef/define/endif 的作用?

答:防止该头文件

被重复引用。

4、#i nclude<file.h> 与 #i nclude file.h的区别?

答:前者是从

standard library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

17、do??while和while??do有什么区别?

答 、前一个循环一

遍再判断,后一个判断以后再循环。

19、程序的内存分配

答:一个由c/c++

编译的程序占用的内存分为以下几个部分

1、栈区(stack)

—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作

方式类似于数据结构中的栈。

2、堆区(heap)—

一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。注意它与数据结构中

的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)

(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一

块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系

统释放。

4、文字常量区—常

量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存

放函数体的二进制代码

21、什么是预编译,何时需要预编译?

答:预编译又称为

预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,

#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预

编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的

任何位置。

19、程序的内存分

答:一个由c/c++

编译的程序占用的内存分为以下几个部分

1、栈区(stack)

—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结

构中的栈。

2、堆区(heap)—

一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。注意它与数据结构中

的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)

(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一

块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系

统释放。

4、文字常量区—常

量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存

放函数体的二进制代码

例子程序

这是一个前辈写的,

非常详细

//main.cpp

int a=0; //全

局初始化区

char *p1; //全

局未初始化区

main()

{

intb;栈

char s[]=abc;

//栈

char *p2; //栈

char *p3=123456;

//123456\0在常量区,p3在栈上。

static int c=0;

//全局(静态)初始化区

p1 =

(char*)malloc(10);

p2 =

(char*)malloc(20); //分配得来得10和20字节的区域就在堆区。

strcpy(p1,123456); //123456\0放在常量区,编译器可能会将它与p3所向123456优化

成一个地方。

}

21、什么是预编译,何时需要预编译?

答:预编译又称为

预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,

#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预

编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的

任何位置。

c编译系统在对程

序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)

文件包含 3)条件编译

1、 总是使用不经常改动的大型代码体。

2、程序由多个模

块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所

有包含文件预编译为一个预编译头。

22、关键字const是什么含意?

答:我只要一听到

被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年dan saks已

经在他的文章里完全概括了const的所有用法,因此esp(译者:embedded systems

programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到

那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但

我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下saks的文章吧。)

如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a

const;

前两个的作用是一

样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不

可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的

整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指

针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能

正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使

不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键

字const呢?我也如下的几下理由:

1). 关键字const

的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉

了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会

感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器

一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关

键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其

被无意的代码修改。简而言之,这样可以减少bug的出现

23、关键字volatile有什么含意 并给出三个不同的例子。

答:一个定义为

volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量

的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,

而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1). 并行设备的硬

件寄存器(如:状态寄存器)

2). 一个中断服务

子程序中会访问到的非自动变量(non-automatic variables)

3). 多线程应用中

被几个任务共享的变量

回答不出这个问题

的人是不会被雇佣的。我认为这是区分c程序员和嵌入式系统程序员的最基本的问题。嵌入

式系统程序员经常同硬件、中断、rtos等等打交道,所用这些都要求volatile变量。不懂

得volatile内容将会带来灾难。

假设被面试者正确

地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正

懂得volatile完全的重要性。

1). 一个参数既可

以是const还可以是volatile吗?解释为什么。

2). 一个指针可以

是volatile 吗?解释为什么。

3). 下面的函数有

什么错误:

int

square(volatile int *ptr)

{

return *ptr *

*ptr;

}

下面是答案:

1). 是的。一个例

子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序

不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int

square(volatile int *ptr)

{

int a,b; a = *ptr; b = *ptr; return a * b; }

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long

square(volatile int *ptr)

{

int a; a = *ptr; return a * a; 篇五:嵌入式工程师面试宝典

初入职场嵌入式工程师面试宝典

随着物联网发展的推进,嵌入式技术越来越成为一名高新技术行业,目前市场对此方面的人才需求也相对较大,各大高校也先后开设了此类课程。但是此专业的学生如何找到一份嵌入式工作?

第一:技术为王,作为技术类工作,技术肯定是至关重要的。如何在短暂的时间向面试官展示你的技术能力? 实物展示项目开发经验是最具说服力的,嵌入式技术作为软硬件相结合的技术,简历上写的天花乱坠也比不上一个实物的展示,通过自己制作一个实物,实现一定的智能控制功能,能够清晰的阐述出你设计的原理以及思路,能够分析自己的代码。不管你展示的项目难易程度高低,至少通过此方法可以让面试官明白第一你是做了精心准备的,是一个负责的人,为了自己的这份工作是用心去准备了的。态度上能给面试官一个好感。第二面试官通过你的讲解也能了解到你的大概水平,就算现在技术不到位,至少也知道你是个可造之材,或者知道如何培养你。

所以技术类工作首先得保证手头有货,而刚好相反目前大多数同学都是表现在口头有货。说到什么技术都知道,arm11都过时了、a8才是主流,元计算、内核裁剪、系统架构等等。说起来天花乱坠,但是实际落实到真正动手能力上„

东方智达科技致力于单片机、嵌入式培训。培养模式也是项目实战为主,所以想提高项目实战的同学欢迎来东方智达学习。

第二:态度诚恳,不卑不亢。

面对面试官不需要表现的过分的谦虚谨慎,个人感觉这种人没活力,没底气,就像一个永远不会犯错的小羔羊。当然本着天下老子第一的态度更不用谈了,毕竟人家现在可以应聘你肯定比你牛x。话说回来“不气盛,那叫年轻人。”我就看好有个性的年轻人,充满着自信,这事我能搞定,这种人也许是企业更希望得到的。

第三:面试服饰礼仪。

本文主要针对嵌入式工程师面试,作为技术工种所以建议不要西装革履了,刚毕业的同学花大几千买套西装真不划算,花几百买套劣质西装倒不如好好买套休闲装,看着精神干净。服饰方面一直提出休闲简约,不要搞的花里胡哨的。自己穿着舒服,别人看着干净刚好。

第四:回答面试官问题。

有几个问题时面试官经常问到的,你未来几年的职业规划,你的理想薪资,你的自我评价。

针对这个几个问题第一你未来几年的职业规划,这个问题也许答案很范,但是个人建议在同学们踏入职场前最好真心把这个问题思考清楚,自己将何去何从,未来的方向在哪里,未来的目标在哪里,有人云:“没有方向的船、任何风都不是顺风”。如果你自己没有清晰的目标不知道自己将去哪里,在你的职业生涯中基本上就是一个工作机器,为了养家糊口的赚钱机器,因为你没有职业上的规划,你只有为了获取生理上的满足,同时面对面试官的这个问题你也应该谨慎回答,不可信口开河说的牛x哄哄,也不和含糊其辞。总之最好的回答是建立在你应聘公司发展的角度。

理想薪资:叫太高怕丢了这个offer,叫太低怕亏了自己,这个问题还是看自己的手头上的能力吧,自己几斤几两自己清楚,叫个合理的价格,是金子总会发光,进来工资低有能力涨的也快,进来工资高结果做不了事、后果可能更惨烈。

自我评价:这个建议实事求是,人无完人,优缺点说清楚,必将将来都是一起工作的人,心照不宣还是要好很多。啥优缺点也是包不住的。,

综上所述,面试就要是做到技术牛逼、态度诚恳、天高地阔任我闯的坦荡。

篇一:嵌入式系统面试的几个问题

嵌入

式程序员应知道的几个基本问题

文章来源:

chinaunix 作者:nigel jo„ 更新时间:2007-2-3 【大 小】 【加入收藏】 c语言测试

是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种

测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开

面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度

来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ansi标准

细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?如要你答出某个字符的ascii

值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花

时间在微机上而不是在嵌入式系统上。如果上述任何问题的答案是是的话,那么我知道我得

认真考虑我是否应该去做这份工作。

从面试者的角度来

讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者c语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智

的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的

真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我

决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点

帮助。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。

这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序

员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果

选择这些考题为你所用,请自行按你的意思分配分数。

预处理器

(preprocessor)

1 . 用预处理指令

#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define

seconds_per_year (60 * 60 * 24 * 365)ul

我在这想看到几件

事情:

1) #define 语法

的基本知识(例如:不能以分号结束,括号的使用,等等)

2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒

而不是计算出实际的值,是更清晰而没有代价的。

3) 意识到这个表

达式将使一个16位机的整型数溢出-因此要用到长整型符号l,告诉编译器这个常数是的长整

型数。

4) 如果你在你的

表达式中用到ul(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个标准宏

min ,这个宏输入两个参数并返回较小的一个。

#define min(a,b)

((a) <= (b) ? (a) : (b))

这个测试是为下面

的目的而设的:

1) 标识#define

在宏中应用的基本知识。这是很重要的。因为在 嵌入(inline)操作符 变为标准c的一部分

之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,

嵌入代码经常是必须的方法。

2)三重条件操作符

的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的代

码,了解这个用法是很重要的。

3) 懂得在宏中小

心地把参数用括号括起来

4) 我也用这个问

题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

3. 预处理器标识

#error的目的是什么?

如果你不知道答案,

请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会

读c语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试

者最好希望自己不要知道答案。

死循环(infinite

loops)

4. 嵌入式系统中

经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解决方案。我首选的方案是:

while(1)

{

}

一些程序员更喜欢

如下方案:

for(;;)

{

}

这个实现方式让我

为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将

用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:我被教着这样

做,但从没有想到过为什么。这会给我留下一个坏印象。第三个方案是用 goto

loop:

...

goto loop;

应试者如给出上面

的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的

basic/fortran程序员。

volatile

8. 关键字

volatile有什么含意?并给出三个不同的例子。

一个定义为

volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变

量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的

值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬

件寄存器(如:状态寄存器)

2) 一个中断服务

子程序中会访问到的非自动变量(non-automatic variables)

3) 多线程应用中

被几个任务共享的变量

回答不出这个问题

的人是不会被雇佣的。我认为这是区分c程序员和嵌入式系统程序员的最基本的问题。搞嵌

入式的家伙们经常同硬件、中断、rtos等等打交道,所有这些都要求用到volatile变量。

不懂得volatile的内容将会带来灾难。

假设被面试者正确

地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正

懂得volatile完全的重要性。

1)一个参数既可以

是const还可以是volatile吗?解释为什么。

2); 一个指针可以

是volatile 吗?解释为什么。

3); 下面的函数有

什么错误:

int

square(volatile int *ptr)

{

return *ptr *

*ptr;

}

下面是答案:

1)是的。一个例子

是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不

应该试图去修改它。

2); 是的。尽管这

并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr

指向一个volatile型参数,编译器将产生类似下面的代码:

int

square(volatile int *ptr)

{

int a,b;

a = *ptr;

b = *ptr;

return a * b;

}

由于*ptr的值可

能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平

方值!正确的代码如下:

long

square(volatile int *ptr)

{

int a;

a = *ptr;

return a * a;

}

位操作(bit

manipulation)

9. 嵌入式系统总

是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的

bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

篇二:嵌入式面试题

(1)

什么是预编译,何时需要预编译:

答案:

1、总是使用不经

常改动的大型代码体。

2、程序由多个模

块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所

有包含文件预编译为一个预编译头。

9、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。

答案:.#define

min(x, y) ((x)>(y)?(y):(x)) //结尾没有‘;’

10、嵌入式系统中

经常要用到无限循环,你怎么用c编写死循环。

答案:while(1){}

或者for(;;)

11、关键字static

的作用是什么?

答案:定义静态变

12、关键字const

有什么含意?

答案:表示常量不

可以修改的变量。

13、关键字

volatile有什么含意?并举出三个不同的例子?

答案:提示编译器

对象的值可能在编译器未监测到的情况下改变。

17.c和c++中的

struct有什么不同?

答案:c和c++中

struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中

struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默

认为private

20.列举几种进程

的同步机制,并比较其优缺点。

答案: 原子操作

信号量机制 自旋锁 管程,会合,分布式系统

21.进程之间通信

的途径

答案:共享存储系

统消息传递系统管道:以文件系统为基础

22.进程死锁的原

答案:资源竞争及

进程推进顺序非法

23.死锁的4个必

要条件

答案:互斥、请求

保持、不可剥夺、环路

24.死锁的处理

答案:鸵鸟策略、

预防策略、避免策略、检测与解除死锁

25. 操作系统中

进程调度策略有哪几种?

答案:fcfs(先来先

服务),优先级,时间片轮转,多级反馈

26.类的静态成员

和非静态成员有何区别?

答案:类的静态成

员每个类只有一个,非静态成员每个对象一个

27.纯虚函数如何

定义?使用时应注意什么?

答案:virtual

void f()=0; 是接口,子类必须要实现

28.数组和链表的

区别

答案:数组:数据

顺序存储,固定大小连表:数据可以随机存储,大小可动态改变

29.iso的七层模型是什么?tcp/udp是属于哪一层?tcp/udp有何优缺点?

答案:应用层表示

层会话层运输层网络层物理链路层物理层 tcp /udp属于运输层 tcp 服务提供了数据流传输、

可靠性、有效流控制、全双工操作和多路复用技术等。与 tcp 不同, udp 并不提供对 ip 协

议的可靠机制、流控制以及错误恢复功能等。由于 udp 比较简单, udp 头包含很少的字节,

比 tcp 负载消耗少。 tcp: 提供稳定的传输服务,有流量控制,缺点是包头大,冗余性不好

udp: 不提供稳定的服务,包头小,开销小

34、线程与进程的

区别和联系? 线程是否具有相同的堆栈? dll是否有独立的堆

栈?

答案:进程是死的,

只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候操作系统就帮你

创建了一个主线程。每个线程有自己的堆栈。 dll中有没有独立的堆栈,这个问题不好回答,

或者说这个问题本身是否有问题。因为dll中的代码是被某些线程所执行,只有线程拥有堆

栈,如果dll中的代码是exe中的线程所调用,那么这个时候是不是说这个dll没有自己独

立的堆栈?如果dll中的代码是由dll自己创建的线程所执行,那么是不是说dll有独立的

堆栈?以上讲的是堆栈,如果对于堆来说,每个dll有自己的堆,所以如果是从dll中动态

分配的内存,最好是从dll中删除,如果你从dll中分配内存,然后在exe中,或者另外一

个dll中删除,很有可能导致程序崩溃

4。对于一个频繁使

用的短小函数,在c语言中应用什么实现,在c++中应用什么实现?

答案:c用宏定义,

c++用inline

5。直接链接两个信

令点的一组链路称作什么?

答案:ppp点到点

连接

7。软件测试都有那

些种类?

答案:黑盒:针对

系统功能的测试 白合:测试函数功能,各函数接口

8。确定模块的功能

和模块的接口是在软件设计的那个队段完成的?

答案:概要设计阶

1、局部变量能否和

全局变量重名?

答案:能,局部会

屏蔽全局。要用全局变量,需要使用:: 局部变量可以与全局变量同名,在函数内引用这个变

量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数

内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个

局部变量的作用域就在那个循环体内

2、如何引用一个已

经定义过的全局变量?

答案:extern 可以

用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件

中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式

引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

3、全局变量可不可

以定义在可被多个.c文件包含的头文件中?为什么?

答案:可以,在不同的c文件中以static形式来声明同名全局变量。可以在不同的c文件中

声明同名的全局变量,前提是其中只能有一个c文件中对此变量赋初值,此时连接不会出错

5、do??while和

while??do有什么区别?

答案:前一个循环

一遍再判断,后一个判断以后再循环。

高级题

1、static全局变

量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函

数与普通函数有什么区别?

答案:全局变量(外

部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方

式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽

在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的

全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变

量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域

局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错

误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它

的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 static

函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函

数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函

数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局变

量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被

引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一

次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,

普通函数在每个被调用中维持一份拷贝

2、程序的局部变量

存在于()中,全局变量存在于()中,动态申请数据存在于( )中。

答案:栈;静态区;

4、队列和栈有什么

区别?

答案:队列先进先

出,栈后进先出÷

防火墙是怎么实现的?

你对哪方面编程熟

悉?

2 ipsec为什么是三层的。l2tp为什么是二层的?

答案:ipsec

(internet 协议安全)是一个工业标准网络安全协议,为 ip 网络通信提供透明的安全服务,

保护 tcp/ip 通信免遭窃听和篡改,可以有效抵御网络攻击,同时保持易用性。ipsec有两

个基本目标:1)保护ip数据包安全;2)为抵御网络攻击提供防护措施。 第三层保护的优

点 通常ipsec提供的保护

需要对系统做一定的修改。但是ipsec在ip传输层即第三层的策略执行(strategic

implementation)几乎不需要什么额外开销就可以实现为绝大多数应用系统、服务和上层协

议提供较高级别的保护;为现有的应用系统和操作系统配置ipsec几乎无须做任何修改,安

全策略可以在active directory里集中定义也可以在某台主机上进行本地化管理。 ipsec

策略在iso参考模型第三层即网络层上实施的安全保护,其范围几乎涵盖了tcp/ip协议簇中

所有ip协议和上层协议,如tcp、udp、icmp,raw(第255号协议)、甚至包括在网络层发

送数据的客户自定义协议。在第三层上提供数据安全保护的主要优点就在于:所有使用ip

协议进行数据传输的应用系统和服务都可以使用ipsec,而不必对这些应用系统和服务本身

做任何修改。 运作于第三层以上的其他一些安全机制,如安全套接层ssl,仅对知道如何

使用ssl的应用系统(如web浏览器)提供保护,这极大地限制了ssl的应用范围;而运作

于第三层以下的安全机制,如链路层加密,通常只保护了特定链路间的数据传输,而无法做

到在数据路径所经过的所有链路间提供安全保护,这使得链接层加密无法适用于 internet

或路由 intranet 方案中的端对端数据保护。 l2tp(第二层隧道协议)通过使用虚拟专用网

(vpn) 连接和第二层隧道协议 (l2tp),可以通过 internet 或其他公共网络访问专用网。

l2tp 是一个工业标准 internet 隧道协议,它和点对点隧道协议 (pptp) 的功能大致相同。

利用l2tp来构建企业的vpn,一样需要运营商支持,因为lac一般是在传统电话交换网络中

部署的,并且一个公司的分支机构以及移动办公的员工在地域上分布很广,所以需要各地的

运营商都具备lac才能够实现企业大范围构建vpn网络。当然企业也可以构建自己的基于

l2tp的vpn网络在l2tp vpn中,用户端的感觉就像是利用ppp协议直接接到了企业总部的

ppp端接设备上一样,其地址分配可以由企业通过dhcp来分配,认证方式可以沿用ppp一直

沿用的各种认证方式,并且l2tp是ietf定义的,其mib库也将定义出来从而可以实现全局

的网络管理。

3 ospf中包的ttl

值是多少?

答案:1,因为

224.0.0.5/224.0.0.6是本地链路组播

4 ospf为什么要划

分区域?

答案:rd用于bgp

区分vpn路由,rt用于在各vrf中导入或导出路由 5 mpls vpn的标签一共有几层。内网的

标签放在哪里。

答案:如果没有流

量工程则是2层,内网标签在隧道标签之后

6 mpls中rd和rt

的作用分别是什么?

答案:减少cpu负

载,区域间使用距离矢量算法,因此其它区域的泛洪不会影响区域的spf运算,这里注意面

试官可能会问ospf多区域如何防止环路。(注意答本质而不是现象,免得面试官追问)

7 rr防止环路的机

制。

答案:rr中通过

origin id和cluster id防止环路,若rr收到带有自己cluster id的路由则丢弃

8 bgp控制

out-bound用local-pre,控制进来的用med.

答案:正确

9 ospf是工作在哪个协议上的?

答案:ip,ospf协

议号89

10 ospf的lsa类

型。

答案:1,2,3,4,

5,6,7,没有什么好说的,注意考官问到第6类lsa,组播再准备多点

11 简述ospf的基

本工作机制。

答案:这个没什么

可以说了,把知道的都说出来就行了

12 ppp的lcp和

ncp协商过程。

答案:lcp过程协

商二层链路相关参数,mtu/ppp压缩/认证协议类型等~~~ncp协商第三层协议,ip地址,ip

压缩等等,这里记住最好不要说cdp 13 笔试中还有一道pstn的信令控制有哪三种?

答案:这个我只知

道随路信令和共路信令,信工同学提供的答案是:监视\号码\音信号\,知道正确答案的朋友

麻烦纠正一下

14sloari 8.0查看

进程的命令是什么?linux 7.3查看ip的命令是什么?

答案:不知道华为

为什么问这个,第一个是ps吧?第二个是ifconfig /a 15 ip是5.32.0.0,掩码255.224.0.0。

请问最大的有效地址是多少。

答案:最大主机地

址5。64。255。254

17 lx/lh的有效距

离是多少?

答案:???

18 ip 包头几个字

节?加上数据部分几个字节

答案:应该是问

ipv4,一般20字节,加上源路由选择等后最大60字节,加上数据部分还是根据链路mtu决

20 cq能不能有一

种流量dominate第二种流量?

答案:cq不能有一

种流量dominate其它任何流量 21 ftp下载一个文件完成。有几个tcp连接答案:4个

篇三:经典嵌入式面试题

经典

嵌入式面试题

c语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织

了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,

此外,撇开面试的压力不谈,这种测试也是相当有趣的。

从被面试者的角度

来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ansi标准

细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ascii值。

这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间

在微机上而不上在嵌入式系统上。如果上述任何问题的答案是是的话,那么我知道我得认真

考虑我是否应该去做这份工作。

从面试者的角度来

讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者c语言的水平。

不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智

的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的

真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

有了这些想法,我

决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点

帮住。这些问题都是我这些

年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。 这个测试适于不同水平的

应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为

了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,

请自行按你的意思分配分数。

预处理器

(preprocessor)

1 . 用预处理指令

#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

#define

seconds_per_year (60 * 60 * 24 * 365)ul

我在这想看到几件

事情:

?; #define 语法

的基本知识(例如:不能以分号结束,括号的使用,等等)

?; 懂得预处理器

将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实

际的值,是更清晰而没有代价的。

?; 意识到这个表

达式将使一个16位机的整型数溢出-因此要用到长整型符号l,告诉编译器这个常数是的长整

型数。

?; 如果你在你的

表达式中用到ul(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个标准宏min ,这个宏输入两个参数并返回较小的一个。 #define min(a,b) ( (a)

<= (b) ? (a) : (b) )

这个测试是为下面

的目的而设的:

?; 标识#define

在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准c的一部分,

宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代

码经常是必须的方法。

?; 三重条件操作

符的知识。这个操作符存在c语言中的原因是它使得编译器能产生比if-then-else更优化的

代码,了解这个用法是很重要的。

?; 懂得在宏中小

心地把参数用括号括起来

?; 我也用这个问

题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = min(*p++, b);

3. 预处理器标识#error的目的是什么?

#error 停止编译

并显示错误信息

如果你不知道答案,

请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会

读c语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试

者最好希望自己不要知道答案。

死循环(infinite loops)

4. 嵌入式系统中经常要用到无限循环,你怎么样用c编写死循环呢?

这个问题用几个解

决方案。我首选的方案是:

while(1)

{

;}

一些程序员更喜欢

如下方案:

for(;;)

{

;}

这个实现方式让我

为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将

用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:我被教着这样

做,但从没有想到过为什么。这会给我留下一个坏印象。

第三个方案是用

goto

loop:

...

goto loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是

一个想进入新领域的basic/fortran程序员。

数据声明(data

declarations)

5. 用变量a给出

下面的定义

a) 一个整型数(an

integer) int a

b)一个指向整型数

的指针( a pointer to an integer) int *a c)一个指向指针的的指针,它指向的指针是

指向一个整型数( a pointer to a pointer to an intege)r *(int *a) int**a

d)一个有10个整

型数的数组( an array of 10 integers)int a[10] e) 一个有10个指针的数组,该指针

是指向一个整型数的。(an array of 10 pointers to integers) int *a[10]

f) 一个指向有10

个整型数数组的指针( a pointer to an array of 10 integers) *(int a[10]) int (*a)[10]

g) 一个指向函数

的指针,该函数有一个整型参数并返回一个整型数

(a pointer to a

function that takes an integer as an argument and returns an integer) fun(*int

a ) int (*max_function)(int a)

h)一个有10个指

针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( an array of ten

pointers to functions that take an integer argument and return an integer )fun(*int

a[10]) int (*a[10])(int)

篇四:嵌入式常见面试题

(2)

char * const p char const * p const char *p 上述三个有什么区别? 答案:

char * const p; //

常量指针,p的值不可以修改

char const * p;

//指向常量的指针,指向的常量值不可以改

请问以下代码有什么问题:

int main()

{

char a;

char

*str=&a;

strcpy(str,hello);

printf(str);

return 0;

}

答案:没有为str

分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽

然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

写一个“标准”宏,

这个宏输入两个参数并返回较小的一个。

答案:

#define min(x, y)

((x)>(y)?(y):(x))

//结尾没有‘;’

char* s=aaa;

printf(%s,s);

s[0]=b;

printf(%s,s);

有什么错?

答案:aaa是字符

串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。 cosnt char* s=aaa;

然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

嵌入式系统中经常

要用到无限循环,你怎么用c编写死循环。

答案:while(1){}

或者for(;;)

关键字const有什么含意?

答案:表示常量不

可以修改的变量。

1、关键字static的作用是什么?

这个简单的问题很

少有人能回答完全。在c语言中,关键字static有三个明显的作用:

1). 在函数体,一

个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块内(但

在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函

数访问。它是一个本地的全局变量。

3). 在模块内,一

个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明

它的模块的本地范围内使用。

关键字volatile有什么含意?并举出三个不同的例子?

答案:提示编译器

对象的值可能在编译器未监测到的情况下改变。

int (*s[10])(int) 表示的是什么啊?

答案:int

(*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。

交换两个变量的值,

不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;

答案:有两种解法,

一种用算术算法, 一种用^(异或) a = a + b; b = a - b; a = a - b; or a = a^b;// 只能

对int,char.. b = a^b; a = a^b; or a ^= b ^= a;

static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区

别?static函数与普通函数有什么区别?

答案:全局变量(外

部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方

式,静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽

在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的

全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域, 即只在定义该变

量的源文件内有效, 在同一源程序的其它源文件中不能使用它。

程序的局部变量存

在于()中,全局变量存在于()中,动态申请数据存在于( )中。 答案:栈;静态区;

6、全局变量和局部

变量在内存中是否有区别?如果有,是什么区别?

答 :全局变量储存

在静态数据区,局部变量在堆栈中。

8、堆栈溢出一般是由什么原因导致的?

答 :1.没有回收垃

圾资源

2.层次太深的递归

调用

14、如何引用一个已经定义过的全局变量?

答 、可以用引用头

文件的方式,也可以用extern关键字,

4、队列和栈有什么区别?

答案:队列先进先

出,栈后进先出

3、.h头文件中的ifndef/define/endif 的作用?

答:防止该头文件

被重复引用。

4、#i nclude<file.h> 与 #i nclude file.h的区别?

答:前者是从

standard library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。

17、do??while和while??do有什么区别?

答 、前一个循环一

遍再判断,后一个判断以后再循环。

19、程序的内存分配

答:一个由c/c++

编译的程序占用的内存分为以下几个部分

1、栈区(stack)

—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作

方式类似于数据结构中的栈。

2、堆区(heap)—

一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。注意它与数据结构中

的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)

(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一

块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系

统释放。

4、文字常量区—常

量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存

放函数体的二进制代码

21、什么是预编译,何时需要预编译?

答:预编译又称为

预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,

#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预

编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的

任何位置。

19、程序的内存分

答:一个由c/c++

编译的程序占用的内存分为以下几个部分

1、栈区(stack)

—由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结

构中的栈。

2、堆区(heap)—

一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。注意它与数据结构中

的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)

(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一

块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系

统释放。

4、文字常量区—常

量字符串就是放在这里的。程序结束后由系统释放。

5、程序代码区—存

放函数体的二进制代码

例子程序

这是一个前辈写的,

非常详细

//main.cpp

int a=0; //全

局初始化区

char *p1; //全

局未初始化区

main()

{

intb;栈

char s[]=abc;

//栈

char *p2; //栈

char *p3=123456;

//123456\0在常量区,p3在栈上。

static int c=0;

//全局(静态)初始化区

p1 =

(char*)malloc(10);

p2 =

(char*)malloc(20); //分配得来得10和20字节的区域就在堆区。

strcpy(p1,123456); //123456\0放在常量区,编译器可能会将它与p3所向123456优化

成一个地方。

}

21、什么是预编译,何时需要预编译?

答:预编译又称为

预处理,是做些代码文本的替换工作。处理#开头的指令,比如拷贝#include包含的文件代码,

#define宏定义的替换,条件编译等,就是为编译做的预备工作的阶段,主要处理#开始的预

编译指令,预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的

任何位置。

c编译系统在对程

序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)

文件包含 3)条件编译

1、 总是使用不经常改动的大型代码体。

2、程序由多个模

块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所

有包含文件预编译为一个预编译头。

22、关键字const是什么含意?

答:我只要一听到

被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年dan saks已

经在他的文章里完全概括了const的所有用法,因此esp(译者:embedded systems

programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到

那篇文章,只要能说出const意味着“只读”就可以了。尽管这个答案不是完全的答案,但

我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下saks的文章吧。)

如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a

const;

前两个的作用是一

样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不

可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的

整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指

针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能

正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使

不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键

字const呢?我也如下的几下理由:

1). 关键字const

的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉

了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会

感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2). 通过给优化器

一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关

键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其

被无意的代码修改。简而言之,这样可以减少bug的出现

23、关键字volatile有什么含意 并给出三个不同的例子。

答:一个定义为

volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量

的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,

而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1). 并行设备的硬

件寄存器(如:状态寄存器)

2). 一个中断服务

子程序中会访问到的非自动变量(non-automatic variables)

3). 多线程应用中

被几个任务共享的变量

回答不出这个问题

的人是不会被雇佣的。我认为这是区分c程序员和嵌入式系统程序员的最基本的问题。嵌入

式系统程序员经常同硬件、中断、rtos等等打交道,所用这些都要求volatile变量。不懂

得volatile内容将会带来灾难。

假设被面试者正确

地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正

懂得volatile完全的重要性。

1). 一个参数既可

以是const还可以是volatile吗?解释为什么。

2). 一个指针可以

是volatile 吗?解释为什么。

3). 下面的函数有

什么错误:

int

square(volatile int *ptr)

{

return *ptr *

*ptr;

}

下面是答案:

1). 是的。一个例

子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序

不应该试图去修改它。

2). 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3). 这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int

square(volatile int *ptr)

{

int a,b; a = *ptr; b = *ptr; return a * b; }

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long

square(volatile int *ptr)

{

int a; a = *ptr; return a * a; 篇五:嵌入式工程师面试宝典

初入职场嵌入式工程师面试宝典

随着物联网发展的推进,嵌入式技术越来越成为一名高新技术行业,目前市场对此方面的人才需求也相对较大,各大高校也先后开设了此类课程。但是此专业的学生如何找到一份嵌入式工作?

第一:技术为王,作为技术类工作,技术肯定是至关重要的。如何在短暂的时间向面试官展示你的技术能力? 实物展示项目开发经验是最具说服力的,嵌入式技术作为软硬件相结合的技术,简历上写的天花乱坠也比不上一个实物的展示,通过自己制作一个实物,实现一定的智能控制功能,能够清晰的阐述出你设计的原理以及思路,能够分析自己的代码。不管你展示的项目难易程度高低,至少通过此方法可以让面试官明白第一你是做了精心准备的,是一个负责的人,为了自己的这份工作是用心去准备了的。态度上能给面试官一个好感。第二面试官通过你的讲解也能了解到你的大概水平,就算现在技术不到位,至少也知道你是个可造之材,或者知道如何培养你。

所以技术类工作首先得保证手头有货,而刚好相反目前大多数同学都是表现在口头有货。说到什么技术都知道,arm11都过时了、a8才是主流,元计算、内核裁剪、系统架构等等。说起来天花乱坠,但是实际落实到真正动手能力上„

东方智达科技致力于单片机、嵌入式培训。培养模式也是项目实战为主,所以想提高项目实战的同学欢迎来东方智达学习。

第二:态度诚恳,不卑不亢。

面对面试官不需要表现的过分的谦虚谨慎,个人感觉这种人没活力,没底气,就像一个永远不会犯错的小羔羊。当然本着天下老子第一的态度更不用谈了,毕竟人家现在可以应聘你肯定比你牛x。话说回来“不气盛,那叫年轻人。”我就看好有个性的年轻人,充满着自信,这事我能搞定,这种人也许是企业更希望得到的。

第三:面试服饰礼仪。

本文主要针对嵌入式工程师面试,作为技术工种所以建议不要西装革履了,刚毕业的同学花大几千买套西装真不划算,花几百买套劣质西装倒不如好好买套休闲装,看着精神干净。服饰方面一直提出休闲简约,不要搞的花里胡哨的。自己穿着舒服,别人看着干净刚好。

第四:回答面试官问题。

有几个问题时面试官经常问到的,你未来几年的职业规划,你的理想薪资,你的自我评价。

针对这个几个问题第一你未来几年的职业规划,这个问题也许答案很范,但是个人建议在同学们踏入职场前最好真心把这个问题思考清楚,自己将何去何从,未来的方向在哪里,未来的目标在哪里,有人云:“没有方向的船、任何风都不是顺风”。如果你自己没有清晰的目标不知道自己将去哪里,在你的职业生涯中基本上就是一个工作机器,为了养家糊口的赚钱机器,因为你没有职业上的规划,你只有为了获取生理上的满足,同时面对面试官的这个问题你也应该谨慎回答,不可信口开河说的牛x哄哄,也不和含糊其辞。总之最好的回答是建立在你应聘公司发展的角度。

理想薪资:叫太高怕丢了这个offer,叫太低怕亏了自己,这个问题还是看自己的手头上的能力吧,自己几斤几两自己清楚,叫个合理的价格,是金子总会发光,进来工资低有能力涨的也快,进来工资高结果做不了事、后果可能更惨烈。

自我评价:这个建议实事求是,人无完人,优缺点说清楚,必将将来都是一起工作的人,心照不宣还是要好很多。啥优缺点也是包不住的。,

综上所述,面试就要是做到技术牛逼、态度诚恳、天高地阔任我闯的坦荡。


相关内容

  • 嵌入式笔试题-高德威
  • 高德威笔试题 --tracy 因为题目有很多代码,记得不是很清楚,只能写个大概... 1.关于sizeof的计算,如对一个指针.对一个数组.对指向数组的指针 2.有一段代码,大概意思是,传给函数一个NULL指针,然后在函数里面进行malloc,把分配后的空间赋给那个空指针.调用结束后,在主程序里用s ...

  • 嵌入式求职笔试面试题目汇总(面试部分)
  • 嵌入式求职笔试面试题目汇总 人的气质与性格的不同,关系到工作效率的不同,甚至影响个人成才.在某些职业中,如飞 行员.运动员.教师等对气质和 性格提出了更严格的要求.合适的个性特征往往决定了一个人是否适宜从事该类职业.瑞士 心理家荣格首先提出内向型和外向型的人格.当前,许多人格心理学家都把内向和外向看 ...

  • 经供参考-嵌入式软件工程师面试题笔试并且含答案
  • 经供参考 1.算术运算符,赋值运算符和关系运算符的运算优先级按从高到低依次为 A.算术运算.赋值运算.关系运算 B.算术运算.关系运算.赋值运算 C.关系运算.赋值运算.算术运算 D.关系运算.算术运算.赋值运算 参考答案:B 2.设#define N 3 #define Y(n) ((N+1)*n ...

  • 嵌入式经典面试题
  • 嵌入式经典面试题六: 关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被 ...

  • 高速嵌入式硬件设计培训课程为您讲解高速嵌入式系统硬件设计技术
  • 热线:021-51875830 62450161 0755-61280252 传真:021-62450161 0755-25912501 业务手机:[1**********] 详情请访问网站:http://www.bjzhda.cn/ http://www.51qianru.cn http://ww ...

  • 面试题--嵌入式软件开发(1)
  • 1. 什么是预编译,何时需要预编译: 答案: 1.总是使用不经常改动的大型代码体.(好工程的回答,不是么---:)) 2.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项.在这种情况下,可以将所有包含文件预编译为一个预编译头. 2. char * const p char con ...

  • 工程实践报告
  • 工程实践报告 这两周我们在北京凌阳爱普科技有限公司进行了嵌入式工程实践.第一天凌阳公司的领导带着我们参观了公司为我们详细地介绍了公司的企业文化和公司的业务范围并为我们现场演示了公司的一些产品. 接下来的几天公司的工程师为我们进行了嵌入式Linux相关的培训,让我们对嵌入式行业有了更深的了解和认识. ...

  • 安全工程专业
  • 安全工程专业 一.培养目标 培养具有宽厚数理化基础,熟练掌握外语.计算机和现代热安全高新技术,徳智体全面发展,能从事热灾害过程的机理.模拟及仿真研究,智能化热安全工程技术与系统研究,热安全性能设计.评估.管理方面的高级专业人才. 学生毕业后将获得工学学士学位,能在能源利用.灾害防治.安全评估.建筑设 ...

  • 嵌入式C语言经典笔试题
  • 嵌入式常见经典笔试题 嵌入式常见经典笔试题 预处理器(预处理器(Preprocessor)Preprocessor) 1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)U ...