我的静态变量在程序启动时取一个随机值,并且没有初始化为0
,因为我希望它能工作。
我在第一文件1中具有这个函数:
void setInput()
{
/*.... Code ...*/
sysUpdate(SysOutput.u16_state);
/*.... Code ...*/
}
它调用另一个文件2:
bool sysUpdate(uint16 state)
{
static uint32 u32_Counter = 0;
if (Condition)
{
u32_Counter += 30;
if (u32_Counter > 30000)
{
u32_Counter = (uint32)0;
/*.... Code ...*/
}
}
/*.... Code ...*/
}
问题是,我的u32_Counter
取一个随机值,尽管它初始化为0,但我的条件第一次总是为真。
你知道这个问题的原因吗?
谢谢你的帮助。
更新:这个问题是由于写入另一个静态数组的边界引起的。下面是引起这个问题的确切原因:
static uint8 state[xNUMBER][yNUMBER];
const uint8 state1[xNUMBER][yNUMBER] = {{0, 1, 0, 0}, {1, 0, 0, 0},{1, 1, 1, 1}};
const uint8 state2[xNUMBER][yNUMBER] = {{0, 1, 1, 1}, {1, 1, 0, 0},{1, 1, 1, 1}};
length = sizeof(state)/sizeof(state[0][0]);
for(i = 0; i < length; i++)
{
for (j = 0; j < length; j++)
{
if(condition)
{
state[i][j] = state1[i][j];
}
else
{
state[i][j] = state2[i][j];
}
}
}
1条答案
按热度按时间irlmq6kh1#
除非您的环境严重损坏,否则
u32_Counter
的初始值保证为0
。一个可能的解释是,这个全局变量被在显示问题的测试之前执行的代码覆盖了。
您可以通过查看Map文件或符号列表及其地址(使用
nm
或objdump
实用程序)来尝试和调查,以查看u32_Counter
之前的变量或数组。缓冲区溢出可能会导致您观察到的情况。您可以将定义移到函数之外,这样就可以在初始代码执行期间的不同时间打印
u32_Counter
的值,但如果您这样做,问题可能会消失,因为变量可能会被放置在数据段中的不同位置,从而不再被覆盖。但是其他变量可能会被覆盖,副作用可能会转移到其他地方。甚至只是删除= 0
初始化器也可能会有这种效果。如果调试器具有监视功能,请在此变量上设置一个监视点,以跟踪修改变量的位置和方式。