在这个简单的C程序中,当我注释Line Y
并保留Line X
原样时,调用的输出将f()
输出0
并Line 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;
}
执行此操作时:
int x;
printf("%d\n", x);
您正在堆栈上分配空间x
,然后打印其值。从理论上讲,该值可以是任何值(您不能期望它为零或任何特定值),但实际上,它将是堆栈上碰巧存在的任何值。
这就是为什么更改周围的代码会更改的值的x
原因,因为程序的其他部分会使用堆栈,而更改这些部分会在堆栈中x
恰好分配了该空间的地方留下不同的值。
x
当您更改编译器选项或使用其他计算机时,您可能还会获得不同的值。
您可能想知道为什么删除“线A”会更改“线A”之前的“线X”的输出。那是因为编译器可能会main
在函数的开头而不是逐行进行所有堆栈分配(例如,它为a
before分配了空间x
,因此更改了您在打印时看到的值x
,因为它已“向下”移了一个)堆栈上的空间)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句