单片机岗位常见面试问题——C语言(2)

一、#define 与 const区别

二、typedef与#define区别

typedef与define都是替一个对象取一个别名,以此来增强程序的可读性

三、指针

指针是C语言中一种特殊的变量,它可以存储另一个变量的内存地址。通过指针,可以间接地访问或修改内存中的数据,而不需要知道它们的具体位置。

1.函数指针

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。

实例:

①用作回调函数(比如串口中断接收过程中,用一个回调函数把接收到的数据传出去处理,保证中断快进快出)

②多态的实现(比如定义一个简单的驱动框架结构体,包含初始化、发送和接收的函数指针,我们只需要分别实现串口和I2C等通信协议的三个接口,需要用到哪个时直接把该协议的接口赋给对应函数指针就可以使用,可以实现灵活的驱动管理)

③多态同一操作用于不同的对象,可以表现出不同的行为 )

2.指针函数

首先它是一个函数,只不过这个函数的返回值是一个地址值。

实例:

malloc函数(void *malloc(size_t size);)用于动态分配一块内存,它返回一个void*类型的指针,指向被分配内存的起始位置。

3.数组和指针的区别与联系

①区别:

②联系:

数组名会“退化”为指向数组第一个元素的指针,数组名是一个指针常量,数组名可以在许多情况下作为指针来使用。可以通过指针来访问数组元素,这使得数组和指针在有些操作上表现得非常相似。

4.野指针

①概念

野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)。

②原因

指针未初始化

③指针越界访问

当指针指向的范围超出数组arr的范围时,p就是野指针

④指针指向的空间释放

⑤危害

使用野指针可能导致程序崩溃、数据损坏、系统不稳定等严重问题

⑥解决办法

1、尽量规避它: 初始化指针 、使用前检查指针有效性(在使用指针之前,用assert检查其是否为 NULL 或指向有效的内存地址 )、释放内存后将指针置为 NULL:在释放(free)指针所指向的内存后,将指针设置为 NULL,以避免再次使用已经释放的内存。

2、发生了如何检测: coredump复原现场检查( 可以使用 ulimit 命令来启用 core dump,如果程序因野指针崩溃,系统会创建一个 core dump 文件,查看崩溃时的堆栈信息,找到导致崩溃的函数调用)、还可以用asan来检测(缓冲区溢出、释放后使用)#通信硬件知识分享#

单片机岗位必备八股知识 文章被收录于专栏

包括c语言常见知识和语法,数据结构,通信协议,STM32,计算机体系结构和硬件,freertos等等

全部评论

相关推荐

头像
2024-12-30 08:25
已编辑
北京大学 嵌入式软件开发
我遍览群书,发现关于程序员的面试技巧,好的建议其实并不多。1.给自己写一份非常专业的简历我的建议是,如果你想增加自己的入选机会,那最好还是花点钱制作一份专业的简历。相较于你将来可能得到的巨大收获,这真的只是一个小小的投资。2.研究面试官当我联系程序员来面试的时候,我总是会事先发电子邮件给他,并附上我的名字和博客地址。但是让我惊讶的是,当我给他面试的时候,他竟然对我还是一无所知。再举个正面的例子,我在面试时也碰到过这类开发人员,甚至能对我以前写的一篇博客或者做的教学视频上面的内容侃侃而谈。你说我会推荐哪个?面试官也是人,也会有人性的弱点和特点。Dale Carnegie曾说过,要让别人对你感兴趣,最简单的方法就是你先表达出对对方的兴趣。不管这种方法是否有欠公正,但是如果你想面试成功,那么我建议你事先最好先好好研究一下你应聘的这家公司和面试官(如果知道的话)。当今社会的信息是如此的发达,我们完全可以在Facebook、Twitter、微博、博客上找到任何人的资料。即使你只是大致浏览一番,也会让你受益良多。3.获得内部推荐知道找工作最简单的方法是什么吗?那就是获得内部推荐。这不但可以增加面试机会,还能提升40%的录用几率。前阵子,我找到了一家心仪的公司。然后直接投简历?NONO,猜猜我是怎么做的吧?首先我找到一名和我有共同想法和意见的开发人员,然后开始关注他的博客。接着我在他的博客中留言、发表建议,并且表现出对他的工作和公司非常感兴趣的想法。最后我成功拿到了这个宝贵的内部推荐资格。很多程序员会说,“可是,某某某公司里面的人我一个也不认识啊”。如果你想就此放弃,那当我什么也没说,如果你愿意试试,我敢打赌,你总能想出一种方法达到你的目的。不过这有个秘诀,那就是首先你得在网上创建自己的“名片”——让别人有了解你的机会,所以do it now吧。4. 写好算法这是每一个开发人员都应该具备的重要技能,而且真要掌握起来也并非那么难。在很多面试中,都会有这样的问题,要求你在白板或者电脑上解决编程问题,但是许多程序员,即使是那些非常优秀的程序员,都会一下子大脑一片空白,完全理不出思路来。如果你能花时间学会如何解决这种类型的面试问题,那么下次再碰到这种场景,就不会这么紧张了。我们会紧张其实和怯场无关,主要是因为我们不熟悉这些问题,也没有自信能解决这种问题。在这方面建立起自信之后,你就再也不会紧张了。5.活力洋溢地回答问题只用一个字或者一句话,照本宣科平平无奇地回答问题,或许在技术上是正确的,但是你忘了应该借此机会好好展示自己的激情——这才是一个开发人员能带给团队的最大正能量。举个例子说,如果我问你什么是多态性,我不是要你按照课本中的定义重复给我听,我希望你能就这个主题阐述一下,然后我们可以更深入地聊一聊。6.小心“陷阱”问题你为什么换工作?说说你最大的优点和缺点。最近一次你是如何解决和同事之间发生的技术分歧的?在回答问题之前,你最好明白面试官问这些问题的目的,掌握如何回答这类问题的技巧。就先说说第一个问题吧“你为什么换工作?”在大多数情况下,面试官想知道的是你是否是一个爱说三道四、惯于诽谤抨击雇主的人。所以千万不要上当。7.永远不要撒谎最糟糕的事就是在面试的时候撒谎。知之为知之,不知为不知,如果你确实不知道,千万不要自作聪明来编造问题的答案。相反,你应该诚实地说,你不知道或者你并不是100%肯定,但是你愿意尝试一下,然后再讲讲自己的想法。讲完之后也可以问面试官正确答案是什么,以显示你对此非常感兴趣。实话告诉你,大多数面试官问的问题都是他们知道的问题,不然如果你滥竽充数给你通过的话就会显得他们像个傻瓜。所以千万不要抱着侥幸心理,一旦发现你在撒谎,面试官马上就会质疑你的人品。8.不要太诚实很多程序员会过多地透露自己的信息,不要以为诚实和完全透明就是最好的政策,殊不知过犹不及。第7条所说的不可撒谎诚然不错,但是我们也没必要将自己所有生活的细节和所有缺点都告诉给面试官。有个性是好的,但是如果暴露了性格缺陷就坏事了。试想一下,要是你说自己喜欢赌博或者沉迷于魔兽世界,我敢打赌,面试官肯定会重新审视你。所以在说自己信息的时候一定要慎重,因为这不但会暴露你的缺陷,还会显得你缺乏应有的判断力。9.基础知识必须牢固是的,很多程序员在面试的时候,甚至理直气壮地说,他们不知道链表和堆栈,因为他们没有受到正规教育或者早就还给老师了。我也承认我们在工作的时候是用不到那些深层次的计算机科学概念的,但是作为一个专业的软件开发人员,你至少应该知道一些基本知识。最后呢祝各位同学工作顺利,关注我分享更多面试知识,嵌入式c++的同学可以看一下大佬总结的面经   http://daxprogram.com
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务