单片机岗位常见面试问题——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等等

全部评论

相关推荐

基本上都是在聊天,问各种思路,八股文不多。感觉时间过的很快,一下50分钟过去了。把一个基础问题说错了,不知道结果咋样了,再然后就是他是纯C++公司,大部分时间问我linux内核的东西1.你和照片长的不像 (我说商家P图的)2.自我介绍3.研究的什么方向,解释了很久,我的算法了啥的(我研究的是操作系统混合任务关键算法)4.有没有发论文,有没有啥成果(我说sci正在审稿,然后发了软著)5.对linux了解多少,对linux内核或者Linux系统哪里比较熟悉(我说内核驱动还有系统开发都比较熟悉,然后问更熟悉那个,我就说了现在是应用方面吧)6.问我linux内核驱动是怎么设计的(我说有3种方式,普通传统的软硬不分离一起写古老的版本,然后平台设备模型,还有设备树)7.你认为3种方式哪种好,(分别分析了优缺点,然后说最后一种好,也有可扩展性啥的)8.你觉得可扩展性是什么,怎么做到,你有什么优点9.设备树怎么就和软件匹配上了(我说了设备树本质就是个文本文件通过里面的属性匹配的,包括of_match_table啥的)10.又问设备树是怎么兼容那么多硬件平台的,写一个i2c设备驱动流程11.项目遇到了哪些问题,怎么解决的,怎么找到的,哪个项目学到的最多,为什么(我说的很详细,摄像头帧数不匹配啥的,排查是看手册,中间还考虑了av_compare_ts的函数api,查看了他们的返回值了,还试了修改缓冲区了啥的等等,最后就是查手册看到的那个参数,,,甚至还问怎么想到的看这个)12.场景题:假如客户端和服务器连接好着,过了几天突然服务器坏了,你觉得是哪里的问题怎么排查(我说了查看网络,查看日志,检测数据,管理软件,重启等方法)13.然后他就说假如日志看不懂,别的也没问题,我怎么还知道这个进程到底死没死(我就说了ps  top htop等命令可以看)14.然后接着问,假如我还想知道,这个进程他都有什么状态(我说了有运行态,停止态等,在PS命令里面的表现就是一个R T 等等大写字母表示)15.假如处于运行,怎么查看他在跑什么逻辑(我说这个我不是特别了解,就是一般也是通过命令查看,具体命令没记住)16.函数内部静态局部变量,和全局静态变量的区别17.如果他们都作为返回值会有什么问题,(然后我说了半天局部的会有问题,但是他好像没听懂以为我说的全局的,然后问我那局部的呢,我就又说了一遍局部的,因为作用域的问题可能函数调用完了就释放了,中间还扯了半天static的特点啥的,,但是算起来全局作为返回值应该是说错了,,)
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

更多
牛客网
牛客企业服务