zhanghua315 发表于 2013-1-18 21:56:11

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:59

别的数组/指针写穿了,破坏了这个变量,

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

zhanghua315 发表于 2013-1-18 22:21:16

snoopyzz 发表于 2013-1-18 22:03 static/image/common/back.gif
别的数组/指针写穿了,破坏了这个变量,

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

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

brahen 发表于 2013-1-18 22:24:37

验证楼上想法,干掉所有其他指针或无关全局数组。

gzh020 发表于 2013-1-19 08:17:54

断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操作是否正确

NJ8888 发表于 2013-1-19 08:31:54

程序不大我觉得是否直接把工程发出来?没必要保密吧

zhanghua315 发表于 2013-1-19 09:04:23

NJ8888 发表于 2013-1-19 08:31 static/image/common/back.gif
程序不大我觉得是否直接把工程发出来?没必要保密吧

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

tbkmcjl 发表于 2013-1-19 09:08:17

zhanghua315 发表于 2013-1-19 09:04 static/image/common/back.gif
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...

举例


uchar shuzu;


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

}

asdf1776 发表于 2013-1-19 09:13:06

zhanghua315 发表于 2013-1-19 09:04 static/image/common/back.gif
不是保密不保密的问题,而是程序没什么价值的东西,主要问题就是集中在这个变量上,其他部分没有一点点的 ...

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

zhanghua315 发表于 2013-1-19 09:14:04

tbkmcjl 发表于 2013-1-19 09:08 static/image/common/back.gif
举例




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

zhanghua315 发表于 2013-1-19 09:15:18

asdf1776 发表于 2013-1-19 09:13 static/image/common/back.gif
那可不一定,如果你有中断操作,而且没加volatile的话

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

asdf1776 发表于 2013-1-19 09:25:16

zhanghua315 发表于 2013-1-19 09:15 static/image/common/back.gif
没有中断,因为我是在调试中,我把其他部分都关了的,况且就是是开了中断,也并没有在中断中进行关于这个 ...

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

zhanghua315 发表于 2013-1-19 09:43:51

asdf1776 发表于 2013-1-19 09:25 static/image/common/back.gif
你重新写个小程序吧,只包含出错的这部分,信息太少,我们没办法帮你

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

zhanghua315 发表于 2013-1-19 09:44:31

gzh020 发表于 2013-1-19 08:17 static/image/common/back.gif
断点设在main入口,看变最值
如果是0,则应该是二楼说的情况
如果不是0,则看看startup代码对bss段的清0操 ...

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

kebaojun305 发表于 2013-1-19 09:49:25

本帖最后由 kebaojun305 于 2013-1-19 09:50 编辑

snoopyzz 发表于 2013-1-18 22:03 static/image/common/back.gif
别的数组/指针写穿了,破坏了这个变量,

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

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

lcw_swust 发表于 2013-1-19 10:13:41

将该变量改个名字

x11223y 发表于 2013-1-19 10:25:33

把省略的全部干掉,在试下会不会,一步步还原回去看下哪里有问题

QQ373466062 发表于 2013-1-19 11:46:59

将工程传上来吧   还有就是将编译好的输出文件也发上来

jiangxingyuan 发表于 2013-1-19 11:53:37

有一个比较笨但可行的办法。在调用前把变量清0,然后把清0语句一直往前面调,很快可以知道是在哪里改了变量的值了。
页: [1]
查看完整版本: C语言,全局变量竟然不听“初始化”命令