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