首页 > 解决方案 > 简单的 C 程序,奇怪的输出

问题描述

在这个简单的 C 程序中,当我评论Line YLine X保持原样时,对输出的调用的f()输出0Line B输出一些随机数。当我评论Line X和取消评论时Line Y,输出是一个随机数,因为是Line B另一个随机数,因为Line Y。但是,当我评论Line A和时Line B,都调用f()output 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;
}

标签: c

解决方案


当你这样做时:

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

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

这就是为什么更改周围的代码会更改 的值x,因为堆栈被程序的其他部分使用,并且更改这些部分会在堆栈中x恰好被分配的那个空间中留下不同的值。

x当您更改编译器选项或使用不同的计算机时,您也可能会得到不同的值。

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


推荐阅读