简单的C程序,奇怪的输出

时间:2020-07-11 03:32:44

标签: c

在这个简单的C程序中,当我注释Line Y并保留Line X时,对f()的调用输出将输出0Line B输出一些随机数。当我注释Line X并取消注释Line Y时,由于Line B,输出是一些随机数,而由于Line Y,输出是另一个随机数。但是,当我评论Line ALine 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;
}

1 个答案:

答案 0 :(得分:5)

执行此操作时:

int x;
printf("%d\n", x);

您正在为x在堆栈上分配空间,然后打印其值。从理论上讲,该值可以是任何值(您不能期望它为零或任何特定值),但实际上,它将是堆栈上碰巧存在的任何值。

这就是为什么更改周围的代码会更改x的值的原因,因为程序的其他部分使用了堆栈,而更改这些部分则会使不同的值位于堆栈中{{1 }}正好被分配。

更改编译器选项或使用其他计算机时,您可能还会获得x的不同值。

您可能想知道为什么删除“ A行”会更改“ A行”之前的“ X行”的输出。那是因为编译器可能会在函数开始时为x进行所有堆栈分配,而不是逐行地进行分配(例如,它会在main之前为a分配空间,从而改变了打印x时看到的值,因为它已“向下”移动了堆栈中的一个空格)。