繁体   English   中英

简单的 C 程序,奇怪的 output

[英]Simple C program, weird output

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

当你这样做时:

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

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

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

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

您可能想知道为什么删除“Line A”会改变“Line A”之前的“Line X”的 output。 这是因为编译器可能会在 function 开始时为main分配所有堆栈,而不是逐行分配(例如,它为x之前的a分配空间,从而改变您在打印x时看到的值,因为它已经转移在堆栈上“向下”一个空间)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM