静态变量初始化C的问题

k2fxgqgv  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(197)

我的静态变量在程序启动时取一个随机值,并且没有初始化为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];
        }
    }
}
irlmq6kh

irlmq6kh1#

除非您的环境严重损坏,否则u32_Counter的初始值保证为0
一个可能的解释是,这个全局变量被在显示问题的测试之前执行的代码覆盖了。
您可以通过查看Map文件或符号列表及其地址(使用nmobjdump实用程序)来尝试和调查,以查看u32_Counter之前的变量或数组。缓冲区溢出可能会导致您观察到的情况。
您可以将定义移到函数之外,这样就可以在初始代码执行期间的不同时间打印u32_Counter的值,但如果您这样做,问题可能会消失,因为变量可能会被放置在数据段中的不同位置,从而不再被覆盖。但是其他变量可能会被覆盖,副作用可能会转移到其他地方。甚至只是删除= 0初始化器也可能会有这种效果。
如果调试器具有监视功能,请在此变量上设置一个监视点,以跟踪修改变量的位置和方式。

相关问题