被调用后的变量初始化事先得到反映

时间:2016-01-28 19:29:23

标签: c initialization

我正在学习C中变量的范围。 有谁可以解释下面发生了什么?

  int w;
  printf("\nw=%d\n", w);     
  w =-1;

尽管我在'printf'之后初始化了变量'w',但它总是得到值“-1”。这让我很困惑,因为我希望它按顺序运行。因此,它应该打印一些随机值。 ***我也试过改变它的值,它总是读取书面值。因此,它没有随机显示“-1”

为了实验,我再次尝试了下面的代码。

  int w;
  printf("\nw=%d\n", w);     
  w =-9;
  w =-1;

现在,它读取的值为“2560”。正如我所料,因为它之前没有正确初始化。

5 个答案:

答案 0 :(得分:7)

在您的代码中

int w;
printf("\nw=%d\n", w); 
当您尝试读取未初始化(自动本地)变量的值时,

会调用undefined behavior。此时w的内容是不确定的,输出结果是未定义的。

读取(使用)值之前始终初始化本地变量。

相关:引用C11,章节§6.7.9,初始化

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。 [....]

,与 Undefined behavior 相关,附件§J.2

  

使用具有自动存储持续时间的对象的值   不确定

答案 1 :(得分:4)

未初始化的变量。在" C"中,这意味着它的价值是"非确定性的"。实际上,变量通常根据什么"铺设"来获得一个值。在它被分配的内存地址。在这种情况下,它的一些值留在堆栈上。

恰好由于程序不应该依赖的外部因素,您经常会在多次运行中获得一致的结果。

答案 2 :(得分:2)

在第一种情况下,编译器正在优化w的赋值。在第二种情况下,它决定不进行优化。

在这两种情况下,编译器都可以选择优化两个分配,因为w在它们出现后不会被使用。

在使用变量之前初始化变量。

答案 3 :(得分:1)

在上述两种情况下

  int w;
  printf("\nw=%d\n", w);  

会返回一个随机垃圾值,因为我们可能会调用它,包括-12560

块引用

答案 4 :(得分:0)

如果不初始化变量,则可以包含垃圾值。因此,它是未定义的行为,在大多数情况下,它会打印随机数字。顺便说一句,正如其他人指出的那样,它取决于编译器,因此它可能与预期值一起工作,或者它可能不起作用。