前天写了一个函数,是用来打包一组数据通过串口发送出去。当时考虑到要打包各种定义的结构类型,所以函数的参数是一个空类型。之后在回调函数中实现他们各自的打包以及最后打包成一组数据帧发送出去。在一开始写的时候,顺手在这个函数中写了一个将空类型转换为一种已经定义的结构(这个因该是在回调函数中实现,在这里属于笔误)。
同时在这个函数中也定义了几个不同类型的结构变量。其中一个参数较多,参数主要由此函数中调用的一个子函数负责填写。而且它是比较重要的一个参数。当时并没有对其进行初始化,也没有考虑子函数是否对其进行全部的变量进行赋值。就没有再去考虑。
一开始测试时,没有错误而且现象很正确,没有仔细再去查看,是否还有bug。
结果今天早上在阅读代码时,发现了那个在函数中没有用到的强制类型转换(在定义变量时直接强制转换),于是顺手将这条定义语句删掉了。
接下来,奇迹发生了。
再测试时,数据出错了。而且错的莫名其妙。根本不是自己需要的数据,一点都不符合帧数据的帧格式。在打印了所有的变量后,发现就是在最后一步,将那个较多变量的B结构,整合为一个数据帧时,出错了。再查看最后一个子函数,发现有一句memcpy(),中用到了B结构中的一个长度变量。结果这个B的长度变量在对其进行赋值的函数中没有被赋值,一般默认为0.但是并没有对其惊醒过初始化,言外之意就是没有初始化,它的数据未知。
在将B结构在定义时调用memset()将其初始化为零。这样再调试时,一切正常。
由此,留下来一个疑问,为什么强制类型转换语句在的时候,它的值会默认为零,而删除了就成了随机数,这里边的原因是什么?
这里需要试着看汇编找答案了吧。(运行平台ARM9)
后来想过, 由于未初始化内存的随机性。 可能在有强制类型转换时, 编译器做了一些额外的处理降低了出错的可能。 而正常情况下, 随机的可能性更大,所以导致了bug的出现。 这里, 还是要在合适的地方, 将需要的变量, 初始化一下。