1、 指针相关
(1) 指针类型转换出错
比如下面这个写串口的函数,长度len是一个int型指针:
图1 写串口API示例
在调试时发现当串口无回复重发时再次去写串口,传进去的长度变了,无法正常写串口
图2串口调试log截图
想要写的数据是上面红框中,实际写的数据是下面红框中,检查发现是传进去的len指针类型不对,把一个char型的 len传进去了,下面的代码很容易出错:
但是Char型指针应该会自动强制转换为int型指针的啊?怎么还会出错呢?
Int型指针转化为char型指针肯定不会出错,而char型指针转化为int指针可能(极大可能))出错,为什么呢?
数据都是以一定的规则存储在对应内存区里,内存最小单元为1byte,数据最终对应的都是硬地址,char型数据占一个内存单元,int型数据占4个内存单元,short型数据占两个内存单元,char型数据的地址都是1的倍数,int型数据地址都是4的倍数,short型地址都是2的倍数,这样底层才能保证数据整齐,内存好管理。
一个int型指针转化为char型指针没问题,是因为4的倍数肯定也是1的倍数,因此int型地址可以随意转化成char型或者short型地址,而把一个char型指针转化成int型指针那极有可能出错,因为1的倍数不一定就是4的倍数,指针在获取数据时可能就会指不到那个位置(比如地址0x0002转成int地址就会出错),即使指到了那个位置获取到的数据也会不对,因为char型指针转为int型指针,相当于多要了3个单元的内存,你怎么知道那3个单元的内存里面原来没有存别的数据呢?
一句话总结指针类型转化:长的指针类型可以转化为短的,短的不能转化为长的。
图3 指针转换图
(2) 指针没有初始化
向没有初始化的指针去引用指针所指内存的值,或者去赋值,肯定会使系统挂掉。指针在没有指向有效的缓存地址时,是没有意义的。如下面代码就会使系统崩溃。
2、 内存相关
(1) 数组下标越界——一个“=”引发的血案
系统初始化时去flash里取数据存到用户的缓存中,用宏定义定义缓存的大小,调试时发现,把数据定义成1024byte,没问题,定义成384byte,一上电就挂掉了,为什么会这样?定的小点反而有问题?