C变量“0初始化”Linux(gcc)vs windows(MinGW)

yvgpqqbh  于 2023-05-06  发布在  Linux
关注(0)|答案(2)|浏览(102)

在Arch Linux上,我用c写了一个程序来读入一些数据并计算一些统计数据。
当在linux上使用gcc进行编译时,没有额外的参数,只有“gcc main.c”,程序的输出是正确的。
然而,使用MinGW在Windows上编译程序(同样没有额外的参数,只有“gcc main.c”)会导致输出不正确,我发现它是不正确的,因为变量的初始值并不总是0,而是0或一个非常大的正数或负数。--重复添加此变量(x += a)以帮助计算数据的标准差。
该变量是double类型数组中的第二个元素(索引1)。
这是唯一一个这样做的变量,它从来不是任何其他变量。如果我使用“-O2”标志,则不再发生错误。
在linux上变量总是初始化为0,但在windows上不总是这样吗?如果是这样,为什么会这样?

h4cxqtbf

h4cxqtbf1#

  • 在linux上变量总是初始化为0吗 *

绝对不行

#include <stdio.h>

void f( void ) {
   int i;
   i = 123;
}

void g( void ) {
   int j;
   printf( "%d\n", j );
}

int main( void ) {
   f();
   g();
}
$ gcc a.c -o a && ./a
123

$ uname
Linux

自动变量(即在没有static关键字的函数中声明的变量)不会被初始化。如果它们看起来是零,那只是偶然。
如果我启用了警告(例如通过添加-Wall -Wextra -pedantic),编译器将抱怨程序的这个问题。

$ gcc -Wall -Wextra -pedantic a.c -o a
a.c: In function ‘f’:
a.c:4:8: warning: variable ‘i’ set but not used [-Wunused-but-set-variable]
    4 |    int i;
      |        ^
a.c: In function ‘g’:
a.c:10:4: warning: ‘j’ is used uninitialized in this function [-Wuninitialized]
   10 |    printf( "%d\n", j );
      |    ^~~~~~~~~~~~~~~~~~~
jljoyd4f

jljoyd4f2#

在C标准中,自动(非静态)变量在声明时不初始化,它们具有先前存在于存储它们的内存中的值。从性能的Angular 来看,这是有意义的,因为将内存置零将需要额外的指令,如果稍后不使用该值,则没有意义。
当你传递-O2时,一个优化可能会以某种方式使该变量变得无关紧要,我们在不知道代码的情况下无法判断。但底线是,如果程序的行为取决于变量的初始值,请始终初始化变量。

相关问题