我读到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 ++上的程序。
答案 0 :(得分:3)
Uninitialized
表示声明,但在使用之前未设置为明确的已知值。
它会有一些价值,但不是可预测的价值。在你的情况下它是2
。在其他系统上,它可能是其他任何东西。
答案 1 :(得分:1)
循环的每次迭代是2的原因是因为每次都使用相同的堆栈位置。对于每次迭代:
答案 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
被分配到同一块内存中,每次执行你的程序