TA的每日心情 | 无聊 2016-12-20 15:08 |
---|
签到天数: 510 天 连续签到: 1 天 [LV.9]以坛为家II
|
本帖最后由 ming1006 于 2013-4-12 11:30 编辑
今天在调一段程序时碰到一个很奇怪的问题,后来终于发现是因为没有初始化局部变量导致的。
子函数的内容框架有大致如下代码- void ScrollPage(char * pPage1,u16 Page1Size,char * pPage2,u16 Page2Size,u8 time)
- {
- u8 time_count,i;
- u16 PageSize;
- u16 j;
- u8 flag = 0;
- if(Page1Size == 0)
- {
- flag |= 0x01;
- }
- if(Page2Size == 0)
- {
- flag |= 0x02;
- }
-
- if(flag&0x01)
- ...;
- else
- ...;
- }
复制代码 第一次在主函数调用这个函数时,我给Page1Size传递的值为0, if(flag&0x01)成立,执行相应的代码... ,然后我在后来我又调用了这个函数若干次,但是穿的参数都不是0,按理要执行else ...但结果是,所有结果都和第一次一样。 后来通过调试我才发现,flag第一次执行完之后为0x01,第二次再执行时,虽然没有执行
if(Page1Size == 0)
{
flag |= 0x01;
}
但是因为flag没有初始化,再次调用这个函数时,单片机自动为这个变量分配的还是这个内存,而这个内存存着上次的结果0x01,于是flag的初值就为0x01,于是就一直是执行if(flag&0x01)后面的内容,而不是else后面的
其实我经常没有为变量初始化的习惯,但一直没有碰到问题是因为在子函数里面使用变量我们一般会用到=号,所以不会有这个问题,但是如果你在里面是以逻辑运算:&、|、~等方式对变量赋值的话,这个隐患就显露了,而这种地方一般不好发现,我也是好久才发现的。
总之,想提醒大伙,平时最好养成给局部变量初始化的习惯,不然哪次栽了,怎么死的你都不知道
|
|