C语言,全局变量竟然不听“初始化”命令
今天遇到个怪事,明明在程序开头定义了一个全局变量,程序执行中间也没有对它进行赋值操作,可是到函数执行中却变了.背景: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声明,各位大侠,有碰到过这种问题的没?大概会是什么原因导致的呢?
别的数组/指针写穿了,破坏了这个变量,
建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写错代码了 snoopyzz 发表于 2013-1-18 22:03 static/image/common/back.gif
别的数组/指针写穿了,破坏了这个变量,
建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写 ...
可否详细的说下,我不是很明白你说的高级断点功能 验证楼上想法,干掉所有其他指针或无关全局数组。 断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操作是否正确 程序不大我觉得是否直接把工程发出来?没必要保密吧 NJ8888 发表于 2013-1-19 08:31 static/image/common/back.gif
程序不大我觉得是否直接把工程发出来?没必要保密吧
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的参考价值。 zhanghua315 发表于 2013-1-19 09:04 static/image/common/back.gif
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...
举例
uchar shuzu;
void killer(void)
{
shuzu=3; //数组只有0-11个序号即12个位置,写12就变成了第十三个,直接写穿数组了,虽然可以写入,但实际上写入的位置不是数组的一部分,而是shuzu后接着的一个变量的位置。
} zhanghua315 发表于 2013-1-19 09:04 static/image/common/back.gif
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...
那可不一定,如果你有中断操作,而且没加volatile的话 tbkmcjl 发表于 2013-1-19 09:08 static/image/common/back.gif
举例
这个我明白,就是超出范围了,可是我遇到的问题是,只是一个全局变量Flag的问题,没有超出定义范围的现象,我在实际的程序中就是这么用的,不存在这个现象。 asdf1776 发表于 2013-1-19 09:13 static/image/common/back.gif
那可不一定,如果你有中断操作,而且没加volatile的话
没有中断,因为我是在调试中,我把其他部分都关了的,况且就是是开了中断,也并没有在中断中进行关于这个变量的赋值操作,也不应该影响到Flag的值的。 zhanghua315 发表于 2013-1-19 09:15 static/image/common/back.gif
没有中断,因为我是在调试中,我把其他部分都关了的,况且就是是开了中断,也并没有在中断中进行关于这个 ...
你重新写个小程序吧,只包含出错的这部分,信息太少,我们没办法帮你 asdf1776 发表于 2013-1-19 09:25 static/image/common/back.gif
你重新写个小程序吧,只包含出错的这部分,信息太少,我们没办法帮你
程序就跟我在1楼举的例子是一样的,我现在比较怀疑的是,会不会是变量定义过多导致空间溢出,从而产生错误的初始化,因为程序虽然不大,但还是有很多的全局变量定义,ARM7 LPC2132内部空间也不是很大,我在函数中定义局部变量就没有发现该问题,所以我比较倾向于这个‘溢出’。至于其他原因,我暂时不清楚。
PS,外出去了,回头再继续。 gzh020 发表于 2013-1-19 08:17 static/image/common/back.gif
断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操 ...
抱歉,刚刚没有看到你的回复,这个我回头可以试试,好建议。
本帖最后由 kebaojun305 于 2013-1-19 09:50 编辑
snoopyzz 发表于 2013-1-18 22:03 static/image/common/back.gif
别的数组/指针写穿了,破坏了这个变量,
建议用高级断点功能,监视这个变量发生变化时产生断点, 就知道哪里写 ...
这么好的方式 怎么不用,设置改变这个变量时断点。 将该变量改个名字 把省略的全部干掉,在试下会不会,一步步还原回去看下哪里有问题 将工程传上来吧 还有就是将编译好的输出文件也发上来
有一个比较笨但可行的办法。在调用前把变量清0,然后把清0语句一直往前面调,很快可以知道是在哪里改了变量的值了。
页:
[1]