查看: 2712|回复: 2

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

[复制链接]
  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-4-12 11:21:52 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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后面的
      其实我经常没有为变量初始化的习惯,但一直没有碰到问题是因为在子函数里面使用变量我们一般会用到=号,所以不会有这个问题,但是如果你在里面是以逻辑运算:&、|、~等方式对变量赋值的话,这个隐患就显露了,而这种地方一般不好发现,我也是好久才发现的。
      总之,想提醒大伙,平时最好养成给局部变量初始化的习惯,不然哪次栽了,怎么死的你都不知道



      
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    但是我调试的结果是第二次的值是第一次调用后留下来的0x01
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    我这个结果是在keil下得到的
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 20:13 , Processed in 0.134503 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.