我正在试图弄清楚为什么即使本地变量i从未在此C程序中初始化,许多系统也会打印出来0 1 2 3 4 5 6 7 8 9
有人可以解释为什么会这样吗?任何帮助表示赞赏!
void foo() {
int i;
printf("%d ", i++);
}
int main() {
int j;
for (j = 1; j <= 10; j++) foo();
}
答案 0 :(得分:7)
行为未定义。统计数据无关紧要。这可能是因为堆栈的布局和初始化,但也可能是出于任何其他原因。
例如,假设:
i
在堆栈上分配,而不是作为寄存器。在这种情况下,i
每次都会引用堆栈上的相同位置,将从0开始,堆栈上的相同位置每次都会递增一次。
答案 1 :(得分:3)
变量i
是在堆栈上创建的,您没有初始化它。所以它包含一些你无法预测的垃圾值。幸运的是,在您的情况下,垃圾值最初为0。如果在另一个系统上运行,您将获得一组不同的值。行为未定义。
由于除了在for循环中调用该函数之外没有做任何事情,幸运的是,变量i
每次都被销毁并重新分配相同的内存空间。因此它也会在迭代中保留其值。
在我的系统上,它给出了这些值。
2009288233
2009288234
2009288235
2009288236
2009288237
2009288238
2009288239
2009288240
2009288241
2009288242
答案 2 :(得分:2)
可能是因为函数中的局部变量被重复分配并从同一个内存块中释放出来。这就是输出重复递增的原因。
初始值为零是运气。它可能是任何其他垃圾价值。
行为未定义,不适用于其他系统。
答案 3 :(得分:0)
由于这是一个简单的程序,你很幸运,我使用了相同的内存位置。由于未初始化,因此将获取之前的值。
然而,这是未定义的。应该用警告编译它来挑选这个bug。
答案 4 :(得分:0)
正如其他人所说,它是未定义的行为,因此没有可靠的答案。
也就是说,你可能会认为最常见的值是0到9.这可能是因为操作系统在程序收到之前将堆栈占用的内存归零。 foo()
表示已经进行的最深的调用,因此它使用的是操作系统将其归零后未触及的内存,因此在第一次调用时,它很可能仍然包含零。
在每次后续调用中,它可能占据堆栈上的相同位置,因此在每次后续调用开始时,它可能以它在上一次调用结束时的值开始。
正确的是它是未定义的行为,根本没有任何保证,但是,它可能至少有可能不是。