[英]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 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;
}
当你这样做时:
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.