2回答

0收藏

子函数内部的局部变量没有初始化的隐患

英飞凌 英飞凌 3348 人阅读 | 2 人回复 | 2013-04-12

本帖最后由 ming1006 于 2013-4-12 11:30 编辑

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



  
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

ming1006

发表于 2013-4-12 12:55:36 | 只看该作者

powerdruy 发表于 2013-4-12 12:50
局部变量在声明完了之后,编译器应该就给其赋值的,我记得KEIL C51是局部变量声明后赋值为0xff,长度跟据定 ...

但是我调试的结果是第二次的值是第一次调用后留下来的0x01
板凳

ming1006

发表于 2013-4-12 13:09:02 | 只看该作者

powerdruy 发表于 2013-4-12 13:01
这个情况跟编译器有关系,没试过PSOC的情况,C8051在KEIL C51下我是观察过变量初始化的值的 ...

我这个结果是在keil下得到的
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条