c-在带有while(1)的main()中将结构实例声明为static/local



我正在e2工作室使用KPIT GNUARM 16工具链开发微型控制器RZA1。我不是这方面的专家,所以我会尽力解释这个问题。这个问题与我的代码中定义的结构mainwindow有关,它包含图形界面的重要功能:

typedef struct
{
page_t      pages[MAXNUMPAGE];
logger_t    storico;
messagges_t messaggio;
graph_t     grafico;
} mainwindow_t;

main()函数中,我声明了该结构的local实例,因为它包含一个while(1)循环,用于在用户交互(即单击按钮(的情况下刷新GUI应用程序。我遇到的问题是,在声明mainwindow_t的实例时使用或不使用static关键字,程序的执行方式会有所不同。例如,

main()
{
static mainwindow_t mainwindow;
....
init_pages(mainwindow.pages);
while(1)
{
page_update(mainwindow.pages);
}
}

工作得非常好,而只有mainwindow_t mainwindow;,在函数init_pages((中所做的更改似乎没有效果:数组页面[MAXNUMPAGE]的整个内容都未初始化。

因此,我的问题是:如果函数基本上从不返回,那么函数内部数组的非静态局部声明和静态局部声明之间是否存在任何函数差异?

问题与变量是否存在于堆栈中无关。它与初始化有关。

具有静态存储持续时间的变量,即文件作用域变量或具有static关键字的局部变量,被隐式初始化,从而(粗略地说(所有算术类型的变量都被初始化为0,所有指针变量都初始化为NULL

相反,具有自动存储持续时间的变量,即在函数内部声明的变量,如果没有显式初始值设定项并且其值为不确定,则不会被初始化。

虽然您没有显示初始化函数,但它显然没有设置mainwindow.pages中的所有字段,并且取决于其他字段被零初始化。当mainwindow被声明为非静态时,这会导致您的程序读取一些不确定的字段,从而导致未定义的行为,这解释了为什么当您试图精简代码时,问题神秘地消失了。

mainwindow添加初始值设定项通过设置显式列出的任何字段来解决此问题,同时将静态对象初始化规则应用于未显式初始化的任何剩余字段。

最新更新