在这个简单的C程序中,当我注释Line Y
并保留Line X
时,对f()
的调用输出将输出0
和Line B
输出一些随机数。当我注释Line X
并取消注释Line Y
时,由于Line B
,输出是一些随机数,而由于Line Y
,输出是另一个随机数。但是,当我评论Line A
和Line B
时,对f()
的两个调用都输出0
。有人可以向我解释为什么会这样吗?先感谢您。顺便说一句,我正在使用gcc
,没有任何标志,并在macOS Catalina上运行它。
#include <stdio.h>
void f() {
int x;
printf("%d\n", x);
}
int main() {
f(); // Line X
int a; // Line A
printf("%d\n", a); // Line B
f(); // Line Y
return 0;
}
答案 0 :(得分:5)
执行此操作时:
int x;
printf("%d\n", x);
您正在为x
在堆栈上分配空间,然后打印其值。从理论上讲,该值可以是任何值(您不能期望它为零或任何特定值),但实际上,它将是堆栈上碰巧存在的任何值。
这就是为什么更改周围的代码会更改x
的值的原因,因为程序的其他部分使用了堆栈,而更改这些部分则会使不同的值位于堆栈中{{1 }}正好被分配。
更改编译器选项或使用其他计算机时,您可能还会获得x
的不同值。
您可能想知道为什么删除“ A行”会更改“ A行”之前的“ X行”的输出。那是因为编译器可能会在函数开始时为x
进行所有堆栈分配,而不是逐行地进行分配(例如,它会在main
之前为a
分配空间,从而改变了打印x
时看到的值,因为它已“向下”移动了堆栈中的一个空格)。