嵌入式软件C语言面试常见问题及答案解析(一)

本文中题目列表

  • 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
  • 2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
  • 3. 预处理器标识#error的目的是什么?
  • 4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?
  • 5. 用变量a给出下面的定义
  • 6. 关键字static的作用是什么?
  • 7. 关键字const有什么含意?
  • 8. 关键字volatile有什么含意?并给出三个不同的例子。
  • 9. 嵌入式系统总是要用户对变量或寄存器进行位操作。
  • 10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。
  • 11. 关键字__interrupt相关问题。
  • 12. 下面的代码输出是什么,为什么?
  • 13. 评价下面的代码片断:
  • 14. 嵌入式系统中,动态分配内存可能发生的问题是什么?
  • 15. 关键字typedef相关问题
  • 16. C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
  • 17. 请用一种简单有效的方式确定机器的大小端。
  • 18. 运行Test()函数会有什么样的结果?
  • 19. 现有如下的代码,问:(1)有什么问题吗?如果有,怎么改正?(2)会导致内存泄漏吗?为什么?


  先来端段热舞放松一下心情吧!!!

  C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。

  从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢 的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。

  从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选 择,还是只是瞎蒙呢?当应试者在某个问题上卡时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。

  有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮助。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。

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

  #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:

  1. #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
  2. 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
  3. 意识到这个表达式将使一个16位机器的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
  4. 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

注:描述中提到16位机器其实在如今的嵌入式设计中还是比较常见的(控制成本,开发简单等),并且就如同常见的32位、64位机器,在进行相关常数的宏定义中在末尾加上数据类型也是一个比较推荐的做法,这样的话在代码设计、阅读、问题调试过程中能够立马注意到可能会产生问题的方面。

2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。

  #define MIN(A, B) ((A) <= (B) ? (A) : (B))

这个测试是为下面的目的而设的:

  1. 标识#define在宏中应用的基本知识。这是很重要的。因为在嵌入(inline)操作符 变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
  2. 三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
  3. 懂得在宏中小心地把参数用括号括起来
  4. 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?

    least = MIN(*p++, b);

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

  编译程序时,只要遇到 #error 就会跳出一个编译错误,其目的就是保证程序是按照你所设想的那样进行编译的。

这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

注:在我做的几个嵌入式项目中设计一些比较通用的底层代码的时候,往往会用到宏定义去定义或者区分一些不同对象或者需求,在#ifdef ... #else ... #endif 里面基本上都会添加 #error 标识用于提示当前这些宏定义是否被正确定义,代码是否按照预期的样子被编译的。

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

这个问题用几个解决方案。

  1. 我首选的方案是 while(1) {}
  2. 一些程序员更喜欢如下方案 for(;;) {},然而这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。
  3. 第三个方案是用goto
Loop:
...
goto Loop;

应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

5. 用变量a给出下面的定义

  1. 一个整型数(An integer)
  2. 一个指向整型数的指针( A pointer to an integer)
  3. 一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
  4. 一个有10个整型数的数组( An array of 10 integers)
  5. 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
  6. 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
  7. 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
  8. 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 ( An arrayof ten pointers to functions that take an integer argument and return an integer )
int a;
int *a;
int **a;
int a[10];
int *a[10];
int (*a)[10];
int (*a)(int);
int (*a[10])(int);

  人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

注:这个真的是经典的不能再经典了,基本上我所参加过的面试里面对这些定义都有或多或少的考察,正如描述中说的,在面试之前真的应该将这些定义印在脑海中。很多时候笔试中问题的你的答案本身并不重要,重要的是你回答问题时候的思路和方法。

6. 关键字static的作用是什么?

  这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:

  1. 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(PS:被修饰的变量将会被存储在全局数据去的静态区,并且延长了此变量的生命周期)。
  2. 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量(PS:即使加了extern也不行)。
  3. 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

  大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

注:在项目中会用N多个全局变量穿插其中,这是避免不了的,比较推荐的是将全局变量用static进行修饰,然后通过set、get函数的形式向外部提供此变量的设置与获取接口。这样省去全局变量漫天飞,也省去extern到处埋,也能是代码逻辑和引用更加简洁。

PS:曾经遇到过一个简单但是排查好久的问题:有一个a.c文件定义了全局数组 int a[100];,然后在b.c中使用extern声明 extern int a[1000];,在a.c中会给数组a进行赋值操作,然后在b.c中获取数组a中的内容并进行相关逻辑运算,但是每次获取数组a的内容一直是0。后来将数组a的首地址通过函数的方式返回后,一切正常。虽然没有细究为什么extern的方式会有这个问题,但是上述推荐的写法肯定会避免这样的问题。

7. 关键字const有什么含意?

  只要一个变量前用const来修饰,就意味着该变量里的数据只能被访问,而不能被修改,也就是const意味着“只读”(read-only)。 规则:const离谁近,谁就不能被修改。

  我只要一听到被面试者说:“const意味着常数”,我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么。如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。&#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/486525.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubesphere服务报错 页面无法登陆

kubesphere的页面无法访问 查看pod服务&#xff0c;发现ks-apiserver的pod一直在重启 在所在node节点&#xff0c;执行dmesg -T 发现内存溢出 修改deploy的memory的配置 原本的request memory的值为100M 调整为2G 修改之后&#xff0c;服务正常启动&#xff0c;页面访问正常…

基于MATLAB的信号处理工具:信号分析器

信号&#xff08;或时间序列&#xff09;是与特定时间相关的一系列数字或测量值&#xff0c;不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号&#xff0c;而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…

Milvus向量数据库01-基础概念

Milvus向量数据库01-基础概念 Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。您可以在 Zilliz Cloud 集群中创建 Collection&#xff0c;然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity …

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…

从变更到通知:使用Python和MongoDB Change Streams实现即时事件监听

MongoDB提供了一种强大的功能&#xff0c;称为Change Streams&#xff0c;它允许应用程序监听数据库中的变更事件&#xff0c;并在数据发生变化时立即做出响应。这在mysql数据库是不具备没有这个功能的。又如&#xff1a;我们在支付环节想一直监听支付回调的状态&#xff0c;就…

【AWR软件】AWR 如何创建测量图

文章目录 前言流程 前言 微博虚拟 实验 流程 project -> graph -> 右键 new graph

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建&#xff0c;Linux发行版上的过程也类型&#xff0c;它主要使用到以下工具链&#xff1a; aarch64 架构的交叉…

qt基本部分控件用法(一)

前言: 以前 windows下做工具主要是MFC&#xff0c;趁有点空时间&#xff0c;研究了QT&#xff0c;感觉跟MFC 差不多&#xff0c;VS 比 QT CREATOR 还是强大&#xff0c;不过QT可以跨平台&#xff0c;功能更强大&#xff0c;MFC 只能在win平台下.&#xff1b; 1&#xff1a;环境…

【hacker送书第19期】自动化测试框架设计

文章目录 前言内容简介获取方式总结 前言 在当今这个高速发展的互联网时代&#xff0c;软件测试已成为保障软件质量的重要环节。而自动化测试更是测试领域中不可或缺的一环。这本书的出版&#xff0c;正是为了帮助我们更好地理解和应用自动化测试框架设计&#xff0c;提升软件…

【Git】:标签管理

目录 理解标签 创建标签 操作标签 理解标签 标签的作用 标记版本&#xff1a;标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项目发布某个版本的时候&#xff0c;针对最后⼀次 commit 起⼀个 v1.0 这样…

[Maven]下载安装、使用与简介

很多框架的下载使用的流程和思路是差不多的&#xff0c;这里以maven做详细介绍。 下载安装与配置变量 下载 首先&#xff0c;我们要使用maven&#xff0c;必须先下载它的相关文件。想要下载&#xff0c;我们可以直接搜索maven。找到它的官网。这里不绕弯子&#xff0c;直接给出…

光猫开DMZ教程

本教程以移动光猫未例&#xff0c;具体操作以实际光猫为准 1、登录移动光猫管理后台 打开浏览器&#xff0c;在浏览器地址栏输入移动光猫登录管理地址192.168.1.1或者tplogin.cn 按“回车键”打开登录页面&#xff0c;然后输入路由器管理密码登录。 移动光猫登录页面 超级密…

高阶数据结构--B树B+树实现原理B树模拟实现--Java

目录 一、B-树概念 二、B-树插入分析 1.用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下&#xff1a; 2.插入过程总结 三、B树插入实现 四、B树 1.B树概念 2.B树的特性 五、B树应用 1.索引 2.Mysql索引 3.InnoDB 一、B-树概念 1970 年&#xff0c; R.Bayer 和…

tsx: tsx以及在表格的使用?

问&#xff1a; tsx文件render:(scope)>{ return ( <div onclick{handleCLick(scope.$index1)}> ) } const handleCllick (i)>{ alert(i) }为什么进入界面就执行了handleClick函数&#xff1f;我希望点击在执行 回答&#xff1a; 问&#xff1a; 我只希望给这一…

MySQL报错:Illegal mix of collations

背景 最近项目上MySQL库运行过程中遇到SQL执行报错&#xff1a;java.sql.SQLException: Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8mb4_0900_ai_ci,IMPLICIT) for operation ‘’ 分析 询问DBA后&#xff0c;被告知是关联查询的表排序规则不一致导致…

FaRM译文

No compromises: distributed transactions with consistency, availability, and performance Aleksandar Dragojevic, Dushyanth Narayanan, Edmund B. Nightingale, Matthew Renzelmann, Alex Shamis, Anirudh Badam, Miguel Castro Microsoft Research 目录 摘要 1. 引…

spark sql 环境安装,java 默认路径和 安装配置!

yum安装java 查看默认路径 update-alternatives --config java # Java 环境变量 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64/jreexport PATH$JAVA_HOME/bin:$PATH# Spark 环境变量 export SPARK_HOME/home/vagrant/soft/sparkexport PATH…

Keepalived配置文件中未指定MASTER节点会出现什么现象?

Keepalived配置文件中未指定MASTER节点会出现什么现象&#xff1f; 在 Keepalived 配置文件中&#xff0c;如果没有明确指定 MASTER 节点的配置&#xff0c;可能会导致 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09; 协议无法正常工作&#xff0c;具体表现如…

注塑机数据采集的3种方案优缺点对比海天注塑机采集震雄科霸科强数据采集注塑机数据采集网关注塑机联网

注塑机数据采集是工业自动化和智能制造中的一个重要环节&#xff0c;它可以帮助企业监控生产过程、优化生产效率、减少故障停机时间&#xff0c;并提高产品质量。你提到的三种采集模式各有特点和应用场景&#xff1a; IO采集&#xff1a; 这种模式主要通过采集注塑机的输入/输出…

TPAMI 2023:When Object Detection Meets Knowledge Distillation: A Survey

摘要 目标检测&#xff08;Object Detection&#xff0c;OD&#xff09;是计算机视觉中的一项关键任务&#xff0c;多年来涌现出了众多算法和模型。尽管当前 OD 模型的性能有所提升&#xff0c;但它们也变得更加复杂&#xff0c;由于参数规模庞大&#xff0c;在工业应用中并不…