免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhutroy
打印 上一主题 下一主题

局部变量的地址做为函数参数传递容易错误? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-12-11 18:18 |只看该作者
原帖由 bruceteen 于 2008-12-11 18:13 发表
看不出任何问题

有个小bug,但和本问题无关
%x对应的是int类型,但你给的是指针类型,所以要么将指针强制转化为int(可能失去精度),要么使用%p



会不会不安全?


以前懒惰,喜欢这样传递

论坛徽章:
0
12 [报告]
发表于 2008-12-11 18:35 |只看该作者
int  read_data(u_int8 base_addr, u_int8 register_addr, u_int8 *udata)
{        
   unsigned char data[64];   
   unsigned long length = 64;
   memset(data, 0,64);
   data[0] = 1;   
   data[1] = 0x80;
   data[2] = base_addr;   
   data[3] = register_addr;   
   usb_control_read(PDEVICE, data, length);  
   if(data[0]==0x01)
    {
      *udata = data[1];                  
      *udata  = 9;
      printf("read address= 0x%x 0x%x data = 0x%x\n ",base_addr,register_addr,  *udata);         
      printf("read address= 0x%x 0x%x addr = 0x%x\n ",base_addr,register_addr,  udata);
          return 1;
     }        
        return 0;
}


void SoftReset()
{
   u_int8 loop=0;        

   u_int8 state = 0xff;        
   printf("state= 0x%x\n", state)        
   read_data(0x06, 0x07, &state);        
        
    printf(" state= 0x%x\n", State);        
   
&nbsp;&nbsp;&nbsp;&nbsp;for(loop=0; loop<10; loop++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" stateaddr =0x%x  data= 0x%x\n",&state , state );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(state!=0x05)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("state= 0x%x\n", state );                                
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_data(0x06, 0x07, &state);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}         
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}               
}



state= 0xff
read address= 0x6 0x7 data = 0x9
read address= 0x6 0x7 addr = 0x23eae7
state= 0x0
stateaddr =0x23eae7  data= 0x0
state= 0x0

read address= 0x6 0x7 data = 0x9
read address= 0x6 0x7 addr = 0x23eae7
stateaddr =0x23eae7  data= 0x2
state= 0x2

read address= 0x6 0x7 data = 0x9
read address= 0x6 0x7 addr = 0x23eae7
stateaddr =0x23eae7  data= 0x0
state= 0x0

read address= 0x6 0x7 data = 0x9
read address= 0x6 0x7 addr = 0x23eae7
stateaddr =0x23eae7  data= 0x3
state= 0x3

read address= 0x6 0x7 data = 0x9
read address= 0x6 0x7 addr = 0x23eae7
stateaddr =0x23eae7  data= 0x3
state= 0x3

[ 本帖最后由 zhutroy 于 2008-12-11 20:18 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2008-12-11 18:38 |只看该作者
程序比较乱;上面的程序删除了一些无关的打印信息

所以没有对齐

论坛徽章:
0
14 [报告]
发表于 2008-12-11 18:53 |只看该作者
u_int8 state = 0xff;   

定以成静态变量, 就没有问题了,


u_int8 state = 0xff;        
void SoftReset()
{
   u_int8 loop=0;        

   
   printf("state= 0x%x\n", state)        
   read_data(0x06, 0x07, &state);        
        
    printf(" state= 0x%x\n", State);        
   
    for(loop=0; loop<10; loop++)
        {
          printf(" stateaddr =0x%x  data= 0x%x\n",&state , state );
          if(state!=0x05)
          {
            printf("state= 0x%x\n", state );                                
            read_data(0x06, 0x07, &state);
          }
          else
            {
           
             break;
            }         
        }               
}


[ 本帖最后由 zhutroy 于 2008-12-11 20:19 编辑 ]

论坛徽章:
0
15 [报告]
发表于 2008-12-11 22:00 |只看该作者

回复 #1 zhutroy 的帖子

楼主 unsigned char就不要用%x打印出来了。
或者unsigned long xxx = *data, 然后再打印xxx.

论坛徽章:
0
16 [报告]
发表于 2008-12-11 22:59 |只看该作者
开头的那个程序肯定没有问题的

论坛徽章:
0
17 [报告]
发表于 2008-12-11 23:02 |只看该作者

回复 #15 meishu 的帖子

局部变量放在栈里面,涉及到入栈出栈的顺序,所以有人说会有危险。

论坛徽章:
0
18 [报告]
发表于 2008-12-11 23:07 |只看该作者
原帖由 samon_fu 于 2008-12-11 23:02 发表
局部变量放在栈里面,涉及到入栈出栈的顺序,所以有人说会有危险。


这些程序 以前在驱动里都没有问题

编译在mplayer播放器 才出现的

比较郁闷的是,我写个小测试get(&a)加在前面; 它又正常了,去掉测试程序, 又不行了

明天需要仔细debug

论坛徽章:
0
19 [报告]
发表于 2008-12-12 04:29 |只看该作者

回复 #18 zhutroy 的帖子

检查你程序的逻辑。

建议你不要去怀疑是时序的问题,一般出这种问题,都是对变量的使用的问题,主要是逻辑出了问题了。

论坛徽章:
0
20 [报告]
发表于 2008-12-12 09:39 |只看该作者
原帖由 samon_fu 于 2008-12-12 04:29 发表
检查你程序的逻辑。

建议你不要去怀疑是时序的问题,一般出这种问题,都是对变量的使用的问题,主要是逻辑出了问题了。





其实这个问题可以用其他方式解决, 比如静态变量, 只是以前写的一些程序用局部变量这样做过, 很怕哪天会出问题

[ 本帖最后由 zhutroy 于 2008-12-12 09:42 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP