原创 变量初始化的疑惑

2013-2-20 19:48 1076 13 17 分类: 消费电子

 

前天写了一个函数,是用来打包一组数据通过串口发送出去。当时考虑到要打包各种定义的结构类型,所以函数的参数是一个空类型。之后在回调函数中实现他们各自的打包以及最后打包成一组数据帧发送出去。在一开始写的时候,顺手在这个函数中写了一个将空类型转换为一种已经定义的结构(这个因该是在回调函数中实现,在这里属于笔误)。

同时在这个函数中也定义了几个不同类型的结构变量。其中一个参数较多,参数主要由此函数中调用的一个子函数负责填写。而且它是比较重要的一个参数。当时并没有对其进行初始化,也没有考虑子函数是否对其进行全部的变量进行赋值。就没有再去考虑。

一开始测试时,没有错误而且现象很正确,没有仔细再去查看,是否还有bug。

结果今天早上在阅读代码时,发现了那个在函数中没有用到的强制类型转换(在定义变量时直接强制转换),于是顺手将这条定义语句删掉了。

 

接下来,奇迹发生了。

再测试时,数据出错了。而且错的莫名其妙。根本不是自己需要的数据,一点都不符合帧数据的帧格式。在打印了所有的变量后,发现就是在最后一步,将那个较多变量的B结构,整合为一个数据帧时,出错了。再查看最后一个子函数,发现有一句memcpy(),中用到了B结构中的一个长度变量。结果这个B的长度变量在对其进行赋值的函数中没有被赋值,一般默认为0.但是并没有对其惊醒过初始化,言外之意就是没有初始化,它的数据未知。

在将B结构在定义时调用memset()将其初始化为零。这样再调试时,一切正常。

由此,留下来一个疑问,为什么强制类型转换语句在的时候,它的值会默认为零,而删除了就成了随机数,这里边的原因是什么?

这里需要试着看汇编找答案了吧。(运行平台ARM9)

文章评论4条评论)

登录后参与讨论

用户1686999 2013-3-18 17:16

锂电池的改进,能促进整个产业的升级。

用户1406868 2013-2-28 10:41

反汇编看下原码喽

1989tie_959541171 2013-2-26 13:17

后来想过, 由于未初始化内存的随机性。 可能在有强制类型转换时, 编译器做了一些额外的处理降低了出错的可能。 而正常情况下, 随机的可能性更大,所以导致了bug的出现。 这里, 还是要在合适的地方, 将需要的变量, 初始化一下。

用户1555751 2013-2-26 09:39

变量要初始化,这是最基本的啊

用户1602177 2013-2-25 13:40

不知博主找到问题的根源了吗?
相关推荐阅读
catch2000 2015-07-19 11:44
信号线小电阻的作用
在一块新的PCB上,测试系统能否正常运行的时候,发现系统上电后没有正常启动。  系统框图如下:   在上电的时刻,CPU A(GPIO电平2.6V)会向串口发送启动日志数据,CPU A启动后,...
catch2000 2015-07-05 17:04
协议设计中ACK机制的影响
在TCP/IP中,延时ACK和Nagle算法。  TCP为了同时处理成块数据(通常为512字节的用户数据)和交互数据(通常用户数据比较少,例如不大于10个字节),采用了延时ACK和Nagle算法...
catch2000 2015-05-23 15:48
话说物联网操作系统
最近好多家都宣布推出自己的物联网操作系统。   1. Google将要在Google I/O大会发布的Brillo; 2. 三星推出的Artik芯片搭载Mentor Graphics的...
catch2000 2015-03-31 23:52
不要采用异或来交换两个变量
在进行两个变量的时候,经常会看到有些书误人子弟的推荐使用异或的方式: 方式一 {   x = x ^ y;   y = x ^ y;   x = x ^ y; } 而不是...
catch2000 2014-10-09 07:28
为什么要测试先行
在产品的研发过程中,测试一项至关重要。不论是软件还是硬件。   软件的测试先行,在研发过程中,就做到质量的保证,因为在出现Bug的时候,容易定位Bug,而且即使是在客户端出现Bug,也能够...
catch2000 2014-10-09 07:26
C语言的面向对象编程(一)
一、前言 对于编程而言,重要的是解决问题的方式,而不是语言本身。面向对象与面向过程是解决问题和思考问题的方式。C语言常说是面向过程开发的语言,因为其缺少很多对于面向对象特性的支持。但,这并不影...
我要评论
4
13
关闭 站长推荐上一条 /2 下一条