搜索
bottom↓
回复: 18

C语言,全局变量竟然不听“初始化”命令

[复制链接]

出0入0汤圆

发表于 2013-1-18 21:56:11 | 显示全部楼层 |阅读模式
今天遇到个怪事,明明在程序开头定义了一个全局变量,程序执行中间也没有对它进行赋值操作,可是到函数执行中却变了.
背景:ARM7,程序不算大,14K左右
例:
unsigned char Flag = 0;
unsigned char key(void);
void main(void)
{
    ;;;;;             //省略一部分程序
    whlei(1) {
        ;;;;         //省略一部分程序
        key();
    }
}
unsigned char key(void)
{
    ;;;;;             //省略一部分程序
    if(Flag == 0)
        UART0_PutStr("Flag  = 0");
    else
        UART0_PutStr("Flag  != 0");
}

编译、下载,重复搞了几次,结果都是打印出"Flag  != 0",我根本没有在其他任何地方调用该变量,也没有对它进行操作,为什么它的值就变了呢?
后来,我实在想不通,就把定义修改为局部变量,并且加入static声明,各位大侠,有碰到过这种问题的没?大概会是什么原因导致的呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-1-18 22:03:59 | 显示全部楼层
别的数组/指针写穿了,破坏了这个变量,

建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写错代码了

出0入0汤圆

 楼主| 发表于 2013-1-18 22:21:16 | 显示全部楼层
snoopyzz 发表于 2013-1-18 22:03
别的数组/指针写穿了,破坏了这个变量,

建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写 ...

可否详细的说下,我不是很明白你说的高级断点功能

出0入0汤圆

发表于 2013-1-18 22:24:37 | 显示全部楼层
验证楼上想法,干掉所有其他指针或无关全局数组。

出0入0汤圆

发表于 2013-1-19 08:17:54 来自手机 | 显示全部楼层
断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操作是否正确

出0入0汤圆

发表于 2013-1-19 08:31:54 | 显示全部楼层
程序不大我觉得是否直接把工程发出来?没必要保密吧

出0入0汤圆

 楼主| 发表于 2013-1-19 09:04:23 | 显示全部楼层
NJ8888 发表于 2013-1-19 08:31
程序不大我觉得是否直接把工程发出来?没必要保密吧

不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的参考价值。

出0入0汤圆

发表于 2013-1-19 09:08:17 | 显示全部楼层
zhanghua315 发表于 2013-1-19 09:04
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...


举例


uchar shuzu[12];


void killer(void)
{
    shuzu[12]=3;   //数组只有0-11个序号即12个位置,写12就变成了第十三个,直接写穿数组了,虽然可以写入,但实际上写入的位置不是数组的一部分,而是shuzu[11]后接着的一个变量的位置。

}

出0入0汤圆

发表于 2013-1-19 09:13:06 | 显示全部楼层
zhanghua315 发表于 2013-1-19 09:04
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...

那可不一定,如果你有中断操作,而且没加volatile的话

出0入0汤圆

 楼主| 发表于 2013-1-19 09:14:04 | 显示全部楼层
tbkmcjl 发表于 2013-1-19 09:08
举例

这个我明白,就是超出范围了,可是我遇到的问题是,只是一个全局变量Flag的问题,没有超出定义范围的现象,我在实际的程序中就是这么用的,不存在这个现象。

出0入0汤圆

 楼主| 发表于 2013-1-19 09:15:18 | 显示全部楼层
asdf1776 发表于 2013-1-19 09:13
那可不一定,如果你有中断操作,而且没加volatile的话

没有中断,因为我是在调试中,我把其他部分都关了的,况且就是是开了中断,也并没有在中断中进行关于这个变量的赋值操作,也不应该影响到Flag的值的。

出0入0汤圆

发表于 2013-1-19 09:25:16 | 显示全部楼层
zhanghua315 发表于 2013-1-19 09:15
没有中断,因为我是在调试中,我把其他部分都关了的,况且就是是开了中断,也并没有在中断中进行关于这个 ...

你重新写个小程序吧,只包含出错的这部分,信息太少,我们没办法帮你

出0入0汤圆

 楼主| 发表于 2013-1-19 09:43:51 | 显示全部楼层
asdf1776 发表于 2013-1-19 09:25
你重新写个小程序吧,只包含出错的这部分,信息太少,我们没办法帮你

程序就跟我在1楼举的例子是一样的,我现在比较怀疑的是,会不会是变量定义过多导致空间溢出,从而产生错误的初始化,因为程序虽然不大,但还是有很多的全局变量定义,ARM7 LPC2132内部空间也不是很大,我在函数中定义局部变量就没有发现该问题,所以我比较倾向于这个‘溢出’。至于其他原因,我暂时不清楚。
PS,外出去了,回头再继续。

出0入0汤圆

 楼主| 发表于 2013-1-19 09:44:31 | 显示全部楼层
gzh020 发表于 2013-1-19 08:17
断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操 ...

抱歉,刚刚没有看到你的回复,这个我回头可以试试,好建议。

出0入8汤圆

发表于 2013-1-19 09:49:25 | 显示全部楼层
本帖最后由 kebaojun305 于 2013-1-19 09:50 编辑
snoopyzz 发表于 2013-1-18 22:03
别的数组/指针写穿了,破坏了这个变量,

建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写 ...


这么好的方式 怎么不用,设置改变这个变量时断点。

出0入0汤圆

发表于 2013-1-19 10:13:41 | 显示全部楼层
将该变量改个名字

出0入0汤圆

发表于 2013-1-19 10:25:33 | 显示全部楼层
把省略的全部干掉,在试下会不会,一步步还原回去看下哪里有问题

出0入0汤圆

发表于 2013-1-19 11:46:59 | 显示全部楼层
将工程传上来吧   还有就是将编译好的输出文件也发上来

出0入0汤圆

发表于 2013-1-19 11:53:37 | 显示全部楼层
有一个比较笨但可行的办法。在调用前把变量清0,然后把清0语句一直往前面调,很快可以知道是在哪里改了变量的值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表