C中的自动变量未初始化但在循环内给定固定值

时间:2013-08-10 05:03:49

标签: c dev-c++

我读到C中的自动变量,如果没有初始化为值,则包含垃圾值。但是,我发现了一些与我的理解不符的东西。请考虑以下代码。

#include <stdio.h>

main() 
{
    int i = 0;

    for (i = 0 ; i< 10; i++)
    {   
        int x;
        int a = 500;
        printf("%d\t%d\n", a, x);

    }
}

输出:

500     2
500     2
500     2
500     2
500     2
500     2
500     2
500     2
500     2
500     2

我的问题是 - 我不应该期待垃圾值而不是2s吗?我在Windows机器上运行Dev-C ++上的程序。

6 个答案:

答案 0 :(得分:3)

Uninitialized表示声明,但在使用之前未设置为明确的已知值。

它会有一些价值,但不是可预测的价值。在你的情况下它是2。在其他系统上,它可能是其他任何东西。

答案 1 :(得分:1)

循环的每次迭代是2的原因是因为每次都使用相同的堆栈位置。对于每次迭代:

  1. 在堆栈顶部创建一个int - 其值未初始化 - 在您的情况下为2
  2. 创建另一个int并初始化为500。
  3. printf()被称为
  4. 创建的2个整数已从堆栈中删除
  5. 重复上述步骤,直至i == 10

答案 2 :(得分:1)

读完评论后,我认为你的意思是你这样编码:

   #include <stdio.h>

   main()
   {
       int i = 0;
       int x = 1;
       printf("%d\n", x);
      for (i = 0 ; i< 10; i++)
       {
          int x;
          int a = 500;
          printf("%d\t%d\n", a, x);

      }
  }

打印屏幕:

1
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736
500     -1216424736

虽然,有意义的代码是:

   #include <stdio.h>

   main()
   {
       int i = 0;
       int x = 1;
       printf("%d\n", x);
       for (i = 0 ; i< 10; i++)
       {
          //int x;
          int a = 500;
          printf("%d\t%d\n", a, x);

      }
  }

屏幕打印:

1
500     1
500     1
500     1
500     1
500     1
500     1
500     1
500     1
500     1
500     1

在第一个代码中,我在循环中创建了一个新的x,新的x的幸存范围只是循环,因为我没有初始化它,它的值是未知的。 (一旦它是0,则另一次是-121642736,你的是2)。

第二个代码,循环中的x正好是循环中的x,它是1。

答案 3 :(得分:0)

您忘记初始化您的x变量:

#include <stdio.h>

main() 
{
    int i = 0;

    for (i = 0 ; i< 10; i++)
    {   
        int x = 0;//change this to whatever you want. The most common initial value is 0
        int a = 500;
        printf("%d\t%d\n", a, x);//this should print: "500    0" correctly, now
    }
}

您所看到的是以前程序中的信息 - 又名垃圾数据。

答案 4 :(得分:0)

int x定义存储(在MS Windows中int是4个字节)。与任何其他存储一样,该存储包含数据,在您的情况下它恰好是2。

答案 5 :(得分:0)

离开x未初始化将从之前的程序或堆栈帧中获取某些值。在C中,堆栈帧内的内存块不一定是零填充,就像某些语言一样,它们保持在先前(或旧)状态。这通常称为垃圾值

只是巧合它是2,它可能很容易就是1000或1293.你可能非常幸运,你的变量x被分配到同一块内存中,每次执行你的程序