-3

我读到 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++ 上运行该程序。

4

6 回答 6

3

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

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

于 2013-08-10T05:07:07.697 回答
1

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

  1. 在堆栈顶部创建一个 int - 它的值未初始化 - 在您的情况下为 2
  2. 另一个 int 被创建并初始化为 500。
  3. printf() 被调用
  4. 创建的 2 个整数从堆栈中删除
  5. 重复上述步骤直到 i == 10
于 2013-08-10T05:21:08.883 回答
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 正是循环外的那个,它是 1。

于 2013-08-10T05:29:05.970 回答
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
    }
}

您看到的是来自以前程序的信息 - 也就是垃圾数据。

于 2013-08-10T05:07:29.167 回答
0

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

于 2013-08-10T05:08:35.740 回答
0

保持未x初始化将给它一些来自先前程序或堆栈帧的值。在 C 中,堆栈帧中的内存块不一定像某些语言那样填充为零,它们保持在以前的(或旧的)状态。这通常被称为垃圾值

它是 2 只是一个巧合,它可能很容易是 1000 或 1293。可能的原因是您非常幸运,并且您的变量x在每次执行程序时都被分配到同一个内存块。

于 2013-08-10T05:09:53.840 回答