在Arch Linux上,我用c写了一个程序来读入一些数据并计算一些统计数据。
当在linux上使用gcc进行编译时,没有额外的参数,只有“gcc main.c”,程序的输出是正确的。
然而,使用MinGW在Windows上编译程序(同样没有额外的参数,只有“gcc main.c”)会导致输出不正确,我发现它是不正确的,因为变量的初始值并不总是0,而是0或一个非常大的正数或负数。--重复添加此变量(x += a)以帮助计算数据的标准差。
该变量是double类型数组中的第二个元素(索引1)。
这是唯一一个这样做的变量,它从来不是任何其他变量。如果我使用“-O2”标志,则不再发生错误。
在linux上变量总是初始化为0,但在windows上不总是这样吗?如果是这样,为什么会这样?
2条答案
按热度按时间h4cxqtbf1#
绝对不行
自动变量(即在没有
static
关键字的函数中声明的变量)不会被初始化。如果它们看起来是零,那只是偶然。如果我启用了警告(例如通过添加
-Wall -Wextra -pedantic
),编译器将抱怨程序的这个问题。jljoyd4f2#
在C标准中,自动(非静态)变量在声明时不初始化,它们具有先前存在于存储它们的内存中的值。从性能的Angular 来看,这是有意义的,因为将内存置零将需要额外的指令,如果稍后不使用该值,则没有意义。
当你传递
-O2
时,一个优化可能会以某种方式使该变量变得无关紧要,我们在不知道代码的情况下无法判断。但底线是,如果程序的行为取决于变量的初始值,请始终初始化变量。